Tre*_*key 7 c++ namespaces g++ c++11
看看这个小程序吧.
#include <iostream>
int main(){
int var = atoi("-99"); //convert string to int
var = abs(var); //takes absolute value
std::cout << var+1 <<'\n'; //outputs 100
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
编译会创建以下错误消息:
$ g++ -o main main.cpp
main.cpp: In function ‘int main()’:
main.cpp:5:13: error: ‘atoi’ was not declared in this scope
main.cpp:6:16: error: ‘abs’ was not declared in this scope
main.cpp:9:10: error: ‘EXIT_SUCCESS’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
可以理解的.所有这些都存在于我忽略的"cstdlib"标题中.
但是,编译:
$ g++ -std=c++0x -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
没有问题.
查看"cstdlib"标头的来源,我在底部看到以下代码:
#ifdef __GXX_EXPERIMENTAL_CXX0X__
# if defined(_GLIBCXX_INCLUDE_AS_TR1)
# error C++0x header cannot be included from TR1 header
# endif
# if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
# include <tr1_impl/cstdlib>
# else
# define _GLIBCXX_INCLUDE_AS_CXX0X
# define _GLIBCXX_BEGIN_NAMESPACE_TR1
# define _GLIBCXX_END_NAMESPACE_TR1
# define _GLIBCXX_TR1
# include <tr1_impl/cstdlib>
# undef _GLIBCXX_TR1
# undef _GLIBCXX_END_NAMESPACE_TR1
# undef _GLIBCXX_BEGIN_NAMESPACE_TR1
# undef _GLIBCXX_INCLUDE_AS_CXX0X
# endif
#endif
Run Code Online (Sandbox Code Playgroud)
我不确定这是否相关.. 这里是完整的头文件代码
我的最终问题是,当你包含iostream时,新标准是否保证所有cstdlib都会被引入全局命名空间?
我找不到有关此事的任何文件.对我来说就是这样,对你来说是这样吗?
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Run Code Online (Sandbox Code Playgroud)
Fre*_*Foo 15
我的最终问题是,当你包含iostream时,新标准是否保证所有cstdlib都会被引入全局命名空间?
不#include,如果您需要它的功能,您应该自己动手.如果你"免费"获得它<iostream>,那就是你的<iostream>标题需要它的标志,但是你依赖于你的C++库的实现细节.
顺便说一句,#include <cstdlib>不能保证将C函数带入全局命名空间(尽管在C++实现中通常会这样做); 保证将它们放在命名空间中std:
除第18条至第30条和附件D中所述外,每个标题的内容
cname应与相应标题的内容相同name.h,如C标准库(1.2)或C Unicode TR中所规定,视情况而定包容性.但是,在C++标准库中,声明(在C中定义为宏的名称除外)在命名空间的命名空间范围(3.3.6)内std.未指定是否首先在全局命名空间范围内声明这些名称,然后std通过显式using-declarations(7.3.3)将其注入命名空间.
(标准,第17.6.1.2节)
| 归档时间: |
|
| 查看次数: |
7924 次 |
| 最近记录: |