我在多个文件中使用一个名称空间,我通过脚本在每个文件的开头插入了"namespace abc{",在末尾插入了"}"(main除外)。因此,"#include"位于每个文件的命名空间下。当我编译时,它不起作用(不能识别系统函数等)。
但是,如果我在"#include"行之后定义名称空间,那么一切都可以正常工作。这里有什么问题?
问题是,通过将头放在命名空间中,可以让它们声明该命名空间中的函数——但这些函数的定义(实现)不存在于该命名空间中,因此当链接时,无法找到它们,链接失败。
举一个具体的例子,假设您有一个声明函数int f(int)
的头。通过将其封装在名称空间的大括号中,可以将其转化为int somenamespace::f(int)
的声明。
虽然已经定义了int ::f(int)
,但int somenamespace::f(int)
尚未定义,因此无法链接。
请注意,这不适用于extern "C"
函数。它们基本上忽略了名称空间,因此(例如)类似于:
namespace x {
#include <stdio.h>
}
不会影响CCD_ 6中的正常C函数。
#include
行应位于命名空间定义之前,否则可能会得到意外结果。预处理器语言与c/c++代码不同,混合使用它们可能会产生难以跟踪的错误。