我在多个文件中使用单个命名空间,我在开头插入了"namespace abc {",在每个文件末尾插入了"}"(主要除外).因此'#include'位于每个文件的命名空间下.当我编译时,它不起作用(不识别系统函数等).
但是如果我在'#include'行之后定义名称空间,一切正常.这里有什么问题?
问题是,通过将标头放在命名空间内,你可以在那个命名空间中声明它们 - 但是那些函数的定义(实现)在该命名空间中不存在,所以当你链接时,它们不能找到并链接失败.
举一个具体的例子,假设你有一个声明了函数的标题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.