我遇到的问题与http://www.cplusplus.com/forum/beginner/12458/上的 'greentype'提到的问题基本相同
我通过名称空间共享变量,当我尝试将函数定义放入单独的文件时出现问题.
考虑以下示例,其中我想将主代码中定义的变量'i'传递给函数a():
*nn.h:*
#ifndef _NN_H_
#define _NN_H_
namespace nn {
int i;
}
#endif
Run Code Online (Sandbox Code Playgroud)
*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;
}
Run Code Online (Sandbox Code Playgroud)
但是现在如果我把a()的定义放到一个单独的文件中......
*a.cpp*
#include <iostream>
#include "nn.h"
void a()
{
using namespace std;
using namespace nn;
i++;
cout << "i = " << i << endl;
}
Run Code Online (Sandbox Code Playgroud)
...然后我在链接时遇到'多重定义'错误(g ++ main.cpp a.cpp -o main).如果我在头文件'extern'中进行'i'声明(如其他论坛中所建议的那样),我会收到'未定义引用'错误.当'i'在标题中声明为const时,我可以编译,但这不是我想要的.
任何建议都非常感谢.
CB *_*ley 13
任何全局对象,例如i,必须在程序中的某个地方只有一个定义,但它可以多次声明.
使用extern没有初始化程序使声明只是一个声明.这适用于您的头文件,但您仍必须在i某处定义.除了制作标题声明之外,extern您还需要extern在一个且仅一个源文件中添加定义(即声明的副本).
编辑:阅读您的问题,您说您想将变量传递给函数.从样式和代码结构的角度来看,这通常不是使用共享(全局)变量的好理由.在没有任何重要原因的情况下,您通常应该定义一个函数,该函数接受一个参数并通过其参数将一个值(可能来自局部变量)从调用站点传递给该函数.
jan*_*anm 10
头文件应该说:
namespace nn {
extern int i;
}
Run Code Online (Sandbox Code Playgroud)
这是"声明"而不是"定义".然后,您需要在一个且只有一个文件中定义:
namespace nn {
int i = 1;
}
Run Code Online (Sandbox Code Playgroud)
当然,一个更好的方法就是根本没有全局变量.