我在多个文件中使用单个命名空间,我在开头插入了“namespace abc {”,在每个文件的末尾插入了“}”(主要除外)。因此'#include'位于每个文件的命名空间下。 当我编译时,它不起作用(不识别系统功能等)。
但如果我在'#include'行之后定义名称空间,一切正常。 这里有什么问题?
答案 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 ++代码不同,混合它们可能会产生难以跟踪的错误。