使用常数编号初始化数组不起作用

时间:2013-05-31 21:27:40

标签: c++ arrays constants

当我使用常量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

2 个答案:

答案 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对象,在每个翻译单元中都有内部链接,但除非用作左值,否则它通常不会占用任何内存。