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

时间:2012-03-07 07:28:49

标签: c++ namespaces

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

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

2 个答案:

答案 0 :(得分:5)

问题在于,通过将头文件放在命名空间中,你可以在那个命名空间中声明函数 - 但这些函数的定义(实现)在该命名空间中不存在,所以当你链接时,无法找到并且链接失败。

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

虽然已定义int ::f(int),但int somenamespace::f(int)尚未定义,因此您无法链接。

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

namespace x {
    #include <stdio.h>
} 

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

答案 1 :(得分:1)

#include行应该在命名空间定义之前进行,否则可能会得到意外的结果。预处理器语言与c / c ++代码不同,混合它们可能会产生难以跟踪的错误。