我遇到的问题与在 http://www.cplusplus.com/forum/beginner/12458/
我通过命名空间共享变量,当我尝试将函数定义放入单独的文件时出现问题。
考虑下面的例子,我想传递变量“i”,定义 在主代码中,到函数 a():
* nn.h: *
#ifndef _NN_H_
#define _NN_H_
namespace nn {
int i;
}
#endif
* main.cpp *
#include <iostream>
#include "nn.h"
using namespace std;
using namespace nn;
void a();
int main()
{
i=5;
a();
}
void a()
{
using namespace std;
using namespace nn;
i++;
cout << "i = " << i << endl;
}
但是现在如果我将 a() 的定义放到一个单独的文件中......
* a.cpp *
#include <iostream>
#include "nn.h"
void a()
{
using namespace std;
using namespace nn;
i++;
cout << "i = " << i << endl;
}
...然后在链接时出现“多重定义”错误(g++ main.cpp a.cpp -o 主)。如果我在头文件“extern”中进行“i”声明(如 在其他论坛中建议),我收到“未定义引用”错误。当“i”在 header 中声明为 const 时,我可以编译,但这不是我想要的。
非常感谢任何建议。
最佳答案
任何全局对象,如 i
,在程序中的某处必须只有一个定义,但它可以声明多次。
在没有初始化器的情况下使用 extern
会使声明只是一个声明。这适用于您的头文件,但您仍必须在某处定义 i
。除了制作 header 声明 extern
之外,您还需要向一个且仅一个源文件添加一个定义(即没有 extern
的声明的拷贝)。
编辑:阅读您的问题时,您说您想将变量传递给函数。从风格和代码结构的角度来看,这通常不是使用共享(全局)变量的好理由。在没有任何压倒一切的原因的情况下,您通常应该定义一个函数,该函数接受一个参数并通过其参数将一个值(可能来自局部变量)从调用站点传递给该函数。
关于c++ - 具有外部链接的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508081/