关于g++中原c标准库和std的疑问

我在程序中用了原c标准库(类似于#include ),用g++编译通过,后来改的时候发现未载入相应的函数(即没用using std::exit之类的),感觉奇怪。于是编了个小程序实验一下,发现原c标准库似乎不在std中(即使用)。
问一下这是为什么,是不是编译器设置,如果是为什么要这样做?怎么改

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

在C++中,头文件 #include <cstdlib>(或者 #include <stdlib.h>)对应于C标准库中的 <stdlib.h> 头文件,其中定义了一些与内存管理、数值转换、随机数生成等相关的函数和宏。当你在C++程序中包含该头文件时,这些函数和宏都会进入全局命名空间,而不是 std 命名空间。


C++标准库(如 <iostream><vector> 等)以及C++11引入的标准库组件都位于 std 命名空间中。这是为了避免全局命名空间的污染和命名冲突,将C++的标准库成员放在 std 命名空间中是一种良好的实践。


如果你希望在C++程序中使用C标准库的函数,但又不想每次都写 std:: 前缀,你可以使用 using 声明来引入特定的标识符到当前作用域。例如,using std::exit; 可以将 exit 函数引入到当前作用域,使你可以直接使用 exit() 而无需写成 std::exit()


以下是一个简单的示例程序,演示了如何使用C标准库函数以及如何通过 using 声明来简化调用:

#include <cstdlib>
#include <iostream>

int main() {
    using std::exit;
    
    std::cout << "Before calling exit()..." << std::endl;
    
    exit(0);
    
    std::cout << "This line will not be executed." << std::endl;
    
    return 0;
}

请注意,根据C++标准,不鼓励在全局范围内使用 using 声明,因为它可能导致命名冲突和可读性问题。最好将 using 声明限制在最小的作用域内,以避免潜在的问题。


总结来说,C标准库的函数和宏位于全局命名空间,而C++标准库的函数位于 std 命名空间中。你可以通过 using 声明将特定的标识符引入到作用域中,以方便使用。