我在多个文件中使用了一个命名空间,并且我通过脚本(main 除外)在每个文件的开头插入了“namespace abc {”并在结尾插入了“}”。因此“#include”位于每个文件的命名空间下。 当我编译时,它不起作用(无法识别系统功能等)。
但是,如果我在“#include”行之后定义 namespace ,则一切正常。 这里有什么问题?
最佳答案
问题是,通过将 header 放在命名空间中,您让它们在该命名空间中声明函数——但这些函数的定义(实现)不存在于该命名空间中,因此当您链接时,它们找不到,链接失败。
举一个具体的例子,假设您有一个 header 声明了一个函数 int f(int)
。通过将其包含在命名空间的大括号内,您将其转换为 int somenamespace::f(int)
的声明。
虽然 int::f(int)
已定义,但 int somenamespace::f(int)
尚未定义,因此无法链接。
请注意,这不适用于 extern "C"
函数。他们基本上忽略了命名空间,所以(例如)像这样:
namespace x {
#include <stdio.h>
}
不会影响 stdio.h
中的正常 C 函数。
关于C++ : Is Namespaces definition allowed before '#include <files>' .,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9597371/