1

コードで使用する定数を正しい方法で定義するのに少し問題があります。Jonathan Leffler のすばらしい投稿を読みましたが、extern を使用してソース ファイル間で変数を共有するにはどうすればよいですか? 、私は何かを誤解しているようです。これはセットアップです:

/*   constants.h   */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;

このヘッダーはrandom.hmain.cで使用され、次のようになります。

#include "constants.h"
int NUM_PARTICLES=104;

random.hまたは_

#include "constants.h"
int LIGHTSPEED=104;

main.c、それぞれ。NUM_PARTICLESの main.c で使用されます

30:  double ghosts[NUM_PARTICLES][4];
31:  double output[NUM_PARTICLES][3];

これは機能しますが、次の警告が表示されます。

main.c: In function ‘int main()’:
main.c:30:32: warning: ISO C++ forbids variable length array ‘ghosts’ [-Wvla]
main.c:31:32: warning: ISO C++ forbids variable length array ‘output’ [-Wvla]

私の意見では、コンパイル時に既知の定数値を配列に与えるため、これは奇妙です。(通常、これらの配列の長さのエラーはいくつかのセグメンテーション違反を引き起こしますが、この場合はそうではありません。) 何かアイデアはありますか?

4

1 に答える 1

5

短編小説: これは C の癖です。

通常、整数定数は次のように定義します。

const int LIGHTSPEED = 104;

問題は、言語規則によれば、この定数は定数式ではないため、静的に割り当てられた配列のサイズを指定するために使用できないことです。

C標準の関連部分(6.6/6、私はこれを作っていません)は、整数定数式が何であるかを定義しています:

整数定数式は整数型を持ち、整数定数、列挙定数、文字定数、結果が整数定数である sizeof 式、およびキャストの即値オペランドである浮動定数であるオペランドのみを持つ必要があります。

これには 2 つの解決策があります。古典的なものは、マクロを使用することです。これは104、コンパイラがコードを認識する前に山括弧の間に単純に貼り付け、配列サイズを整数定数にします。

#define NUM_PARTICLES 104

より良い方法 (IMO) は、可能であるためマクロを避け、enum可能である (列挙定数を使用している) を使用することです。

enum { NUM_PARTICLES = 104 };
于 2013-03-29T21:39:53.863 に答える