gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:43:35 25 4
gpt4 key购买 nike

我遇到的问题与在 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.cppa.cpp -o 主)。如果我在头文件“extern”中进行“i”声明(如在其他论坛中建议),我收到“未定义引用”错误。当“i”在 header 中声明为 const 时,我可以编译,但这不是我想要的。

非常感谢任何建议。

最佳答案

任何全局对象,如 i,在程序中的某处必须只有一个定义,但它可以声明多次。

在没有初始化器的情况下使用 extern 会使声明只是一个声明。这适用于您的头文件,但您仍必须在某处定义 i。除了制作 header 声明 extern 之外,您还需要向一个且仅一个源文件添加一个定义(即没有 extern 的声明的拷贝)。

编辑:阅读您的问题时,您说您想将变量传递给函数。从风格和代码结构的角度来看,这通常不是使用共享(全局)变量的好理由。在没有任何压倒一切的原因的情况下,您通常应该定义一个函数,该函数接受一个参数并通过其参数将一个值(可能来自局部变量)从调用站点传递给该函数。

关于c++ - 具有外部链接的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com