关于extern和const组合的变量的问题

时间:2011-08-04 22:59:20

标签: c++ const extern

我在互联网上用Google搜索了const + extern,但似乎对我的问题没有一个好的答案。

const表示内部链接,但是如果我想在编译单元之间共享一个const变量。 extern是最佳选择吗?

常见的解决方案是:

//g.h
extern const int MAX;

// g.c
extern const int MAX = 3;

然而,这个解决方案有一个缺点,如下所示:

// Say, I want to use this MAX in the same header file.
// g.h
extern const int MAX;
class AClass
{
public: 
    AClass (): i(MAX){}
private:
    int i;
};

编译器会抱怨:“错误C2057:预期的常量表达”。

有解决方法吗?

6 个答案:

答案 0 :(得分:4)

如果你希望能够在编译时使用你的常量(即通过它调整数组的大小,而不使用VLA),那么必须在编译时知道它,即它不能有外部链接。

但是,您可以在头文件中声明常量,并将其提供给包含它的任何人。但是,这与外部链接不会产生完全相同的效果。

// a.h
const int MAX = 3;

// a.cpp
#include "a.h"
int b[a];

答案 1 :(得分:3)

常数整数的简单解决方案是使用枚举:

// g.h
enum { MAX = 3; }

// g.c

#include "g.h"
static char buf[MAX];

您将无法获取MAX的地址,但反过来您可以获得零内存成本。

答案 2 :(得分:2)

extern const int MAX;
int i[MAX];

无法完成。你可以做点什么

const int MAX = ReadAnIntegerFromTheConsole();

完全有效和合法,但是没有持续表达。

答案 3 :(得分:2)

  

const单独意味着内部联系

这不正确,static表示内部链接,const只是表示对象无法变异。尝试将变量声明为

extern static int foo;

您的编译器会抱怨链接冲突。要在翻译单元之间共享const,请完全按照您的建议进行操作。

在标题

extern const int MAX;

在源文件

const int MAX = 10; // note you can omit the extern here

答案 4 :(得分:1)

这是一个可以解决您的问题的工作示例。总之,将数组大小定义为头文件中的常量。在另一个头文件中,将数组声明为extern。在下面的示例中,我将数组引用为extern,而不使用数组的包含文件。

<强> array_size.hpp

const unsigned int MAX_ARRAY_SIZE = 16;

<强> array.cpp

#include "array_size.hpp"
int array[MAX_ARRAY_SIZE];

<强>的main.cpp

#include "array_size.hpp"

// Reference the array from array.cpp
extern int array[MAX_ARRAY_SIZE];

int main(void)
{
  array[1] = 7;
  return 0;
}

* array_size.hpp *文件定义大小,标识符可以通过包含标题在其他翻译单元中使用。

我用Cygwin编译:

g++ -I. -o array.exe main.cpp array.cpp

答案 5 :(得分:0)

为什么不使用#define?

#define MAX 3