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



我在多个文件中使用一个名称空间,我通过脚本在每个文件的开头插入了"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++代码不同,混合使用它们可能会产生难以跟踪的错误。

相关内容

最新更新