C++:在'#include <files>'之前是否允许命名空间定义.

Dha*_*dra 3 c++ namespaces

我在多个文件中使用单个命名空间,我在开头插入了"namespace abc {",在每个文件末尾插入了"}"(主要除外).因此'#include'位于每个文件的命名空间下.当我编译时,它不起作用(不识别系统函数等).

但是如果我在'#include'行之后定义名称空间,一切正常.这里有什么问题?

Jer*_*fin 5

问题是,通过将标头放在命名空间内,你可以在那个命名空间中声明它们 - 但是那些函数的定义(实现)在该命名空间中不存在,所以当你链接时,它们不能找到并链接失败.

举一个具体的例子,假设你有一个声明了函数的标题int f(int).通过将其包含在命名空间的大括号内,您将其转换为声明int somenamespace::f(int).

虽然int ::f(int)已经定义,但int somenamespace::f(int)还没有,所以你无法链接.

请注意,这不适用于extern "C"功能.它们基本上忽略了名称空间,所以(例如)类似于:

namespace x {
    #include <stdio.h>
} 
Run Code Online (Sandbox Code Playgroud)

不会影响正常的C函数stdio.h.