当我使用常量nVar
而不是数字时,我收到以下错误。
constants.h:
extern const unsigned int nVar;
constants.cpp:
#include "constants.h"
const unsigned int nVar = 5;
main.cpp
#pragma once
#include "constants.h"
void foo(const double q[nVar])
{
// ...
}
编译器:
数组常量不是']'标记
之前的整数常量预期')'之前','代币
在'const'之前预期的nonqualified-id
答案 0 :(得分:5)
我认为这是因为编译器应该在编译时知道数组的大小,但是在你的示例中,nVar的值只有在链接时才知道由于extern
答案 1 :(得分:1)
首先,在我们的示例中,您没有使用常量“初始化”数组。您正在指定数组的大小。请注意,在给定的示例中,无论如何都将忽略数组大小。你的声明
void foo(const double q[nVar])
实际上相当于
void foo(const double q[])
和
void foo(const double *q)
其次,为了使整数常量可用于常量表达式,必须使用初始化程序声明。在main.cpp
中,声明的常量没有初始值设定项,这意味着它不能形成常量表达式,也不能在数组声明符中使用。
除非你真的需要一个带有外部链接的const对象,否则声明你的常量的正确方法是
const unsigned int nVar = 5;
在头文件中。注意:没有extern
,并且在头文件中指定了初始化程序。在这种情况下,必须删除constants.cpp
中的定义。从技术上讲,这将创建一个独立的nVar
对象,在每个翻译单元中都有内部链接,但除非用作左值,否则它通常不会占用任何内存。