1

nVar数値の代わりに定数を使用すると、次のエラーが発生します。

定数.h:

extern const unsigned int nVar;

定数.cpp:

#include "constants.h"
const unsigned int nVar = 5;

main.cpp

#pragma once
#include "constants.h"
void foo(const double q[nVar])
{
    // ...
}

コンパイラ:

']' トークンの前の配列定数は整数定数ではありません

「,」トークンの前に「)」が必要です

'const' の前に unqualified-id が必要です

4

2 に答える 2

5

コンパイラはコンパイル時に配列のサイズを知る必要があるためだと思いますが、あなたの例では、 extern のためにリンク時にのみ nVar の値がわかります

于 2013-05-31T21:33:48.783 に答える
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オブジェクトが作成されますが、左辺値として使用されない限り、通常はメモリを占有しません。

于 2013-05-31T22:33:39.263 に答える