2016-04-18 2 views
0

私はC++プログラムのいくつかのテストを実行し、実行するたびにマクロを再定義するシェルスクリプトを作成しようとしています。私は-D 名前プリプロセッサオプション(https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html参照)を使用しようとしていますが、マクロが再定義されているという警告が常に出てきて、プログラムを再定義せずに実行します。シェルスクリプトから-D nameコンパイルオプションを使用する

次のように私のスクリプトは次のとおりです。

、私は述べる++ファイル、project01.cpp私のCで
#!/bin/bash 

#NUMS is number of subdivisions: 
for subdiv in 10 100 500 1000 
do 
    echo NUMS = $subdiv 
    g++ -D NUMS=$subdiv project01.cpp -o project01 -lm -fopenmp 
    ./project01 >> bezier_results.txt 
done 

#define NUMS 1 

私が '1' を入れて試してみたが、それが生成しますエラーも同様です。スクリプトが実際にマクロを再定義していないことは明らかです。何かご意見は?ありがとう!

+0

それはまさにその警告が言っていることです、あなたはそれを再定義しています。コマンドラインで一度定義し、ファイル内で再度定義しました。あなたの意図がコマンドラインから_override_するのであれば、ソースの定義を '#ifndef NUMS' /' #endif'のペアで囲みます。 _それは、スクリプトが実際にマクロを再定義していないことは明らかです_ - あなたは正しいです。再定義は '#define NUMS 1'ソースで行われました。コマンドラインが最初に見えました。 – mah

答えて

1

コマンドラインでマクロを-DNUMS=100と定義すると、デフォルト値が提供されます。

#define NUMS 1 

コンパイラの警告が起こった正確に何を言っている:

あなたしているコードは、あなたがそのデフォルト値をオーバーライドしています。それはすでに定義されていない場合さて、コンパイラは1つだけとNUMSを再定義します

#if !defined NUMS 
#define NUMS 1 
#endif 

(または、この場合には、コマンドライン、すなわち他の場所であなたのソースインチ):代わりにこのような何かをコーディング考えます
関連する問題