我在头文件中创建了一个包含一些变量的noname命名空间,想要在.cpp中初始化它们并在main.cpp中查看。一个noname命名空间我希望工作得很好而不提及.cpp中的这个命名空间。但是我得到的错误好像在.cpp中我有全新的a和b。任何人都知道如何解决它?
xx.h
namespace
{
int a;
int b;
}
的.cpp
#include "xx.h"
a = 5;
b = 10;
的main.cpp
#include <iostream>
#include "xx.h"
int main()
{
std::cout << "values" << a << b << std::endl;
}
答案 0 :(得分:2)
您不能在函数外部使用赋值语句。您只能声明或/和定义对象。所以有效的代码将是
namespace
{
int a = 5;
int b = 10;
}
的main.cpp
#include <iostream>
#include "xx.h"
int main()
{
std::cout << "values" << a << b << std::endl;
}
考虑在未命名的命名空间中声明的对象具有内部链接。这意味着如果此标头包含在多个模块中,则在每个模块中它声明一个单独的命名空间。
构建以下示例
的 unnamed.h 强> 的
namespace
{
int a = 5;
int b = 10;
}
void f();
的 second.cpp 强> 的
#include <iostream>
#include "unnamed.h"
void f()
{
a = 10; b = 5;
std::cout << "a = " << a << ", b = " << b << std::endl;
}
的的main.cpp 强> 的 #包括 #include“unnamed.h”
int main()
{
f();
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}
输出
a = 10, b = 5
a = 5, b = 10
答案 1 :(得分:0)
问题不在于匿名命名空间。无法在全局范围内分配变量。
// At global scope
int num;
num = 10; // Error. You are doing something similar.
初始化命名空间本身的变量或在函数中赋值。
答案 2 :(得分:0)
你的标题必须将它们声明为extern,而在cpp中你必须定义它们。 (否则任何包含文件都会创建自己的a
和b
)
这可能有效(因为匿名命名空间而非常不确定):
xx.h
namespace
{
extern int a;
extern int b;
}
的.cpp
#include "xx.h"
int a = 5;
int b = 10;
的main.cpp
#include <iostream>
#include "xx.h"
int main()
{
std::cout << "values" << a << b << std::endl;
}