我在互联网上用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:预期的常量表达”。
有解决方法吗?
答案 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