c++ - 具有外部链接的命名空间

标签 c++ namespaces

我遇到的问题与在 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/

相关文章:

c++ - 我的复制构造函数弄乱了列表中的第一个元素

c++ - 共享指针的段错误

clojure - 为什么我不能 :require :refer in clojurescript?

c# - 使用指令导入子命名空间

c++ - 期望在两个相同平台上构建两个共享库是否合理?

c++ - 如何用模板函数替换宏?

c++ - operator<< 打印一个底层类型为 short 的枚举值是不明确的

R包不加载依赖

c++ - 如何将全局范围函数声明为命名空间类的 friend ?

PHP 命名空间自动加载