如何访问一个文件中存在的全局const变量到不同的文件

时间:2012-02-05 14:08:45

标签: c++

此变量在xyz.cpp中定义

const int i = 10;

下面的main()方法是用abc.cpp

编写的
void main()
{
    cout<<i; //trying to access 'i' from a different .cpp file
}

5 个答案:

答案 0 :(得分:10)

您需要在abc.cpp中声明extern

extern const int i;

编辑:如下面的评论中所述,在C ++中(与C不同),要提供const变量外部链接,您还需要声明它extern在xyz.cpp中:

extern const int i = 10;

参考:MSDN

答案 1 :(得分:5)

最简单的方法是在标题中将其声明为const static int i=10;,并在需要该常量的所有.cpp中包含该标头。这将允许编译器在每个目标文件中“内联”它,仍然避免ODR违规。

--- ---编辑

实际上,在C ++中,static不是必需的,因为const对象默认具有内部链接。但是在C中,你必须把static(并且在C ++中它没有受到伤害)。

为什么这比extern方法更好?这是因为:

  1. 这更具惯用性。在C ++中,您总是将标题中的积分常量写为const变量(这就是为什么它们默认具有内部链接的原因)。
  2. 打字少了。你只需要写一次const声明,然后你的常数就只有#include了。
  3. 它(通常)产生更高效的代码。编译器在生成当前对象模块时无法访问extern - 声明变量的定义,因此无法通过将其实际值作为生成的机器代码中的立即值来优化它,它无法消除分支使用该常量值无法达到...当然,跨模块优化(“链接时间代码生成”,“整个程序优化”,......)确实存在,但目前编译器具有更高级的优化器比连接器。

答案 2 :(得分:3)

在其前面添加关键字extern

abc.cpp中声明为:

extern const int i = 10;
C ++中的

const变量在C ++中具有内部链接(与C不同)。因此,为了能够在另一个文件中使用它,您必须明确地将其声明为具有外部链接。

答案 3 :(得分:2)

将此全局变量放入标题,并在要使用它的所有.cpp文件中将此标题#include

xyz.h:

const int i = 10;

xyz.cpp:

#include "xyz.h"

void main()
{
    cout << i;
}

或者如果你想避免为此目的使用header,你可以在xyz.cpp中将它声明为extern const int i = 10;,但是你也必须在abc.cpp中声明这个变量,所以你应该写{{ 1}}在abc.cpp的开头为了使用它。

答案 4 :(得分:1)

与使用extern变量的方式相同。 在文件xyz.cpp中:

extern const int i = 333;

在文件abc.cpp中:

extern const int i;
cout << i;