- ベストアンサー
C言語でdefine文のパラメータを実行時に変化させる方法
- C言語でdefine文のパラメータを実行時に変化させる方法を紹介します。
- シェルスクリプトを使用して、define文で指定される定数のパラメータを自動的に変化させることができます。
- 具体的な例を挙げて説明します。環境はLinuxです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#define LOOP 400 <---- ここを実行時に変化させたい。 上記行をLOOP未定義の場合defineするように変えておきます。 #ifndef LOOP #define LOOP 400 #endif とか #if ! defined LOOP #define LOOP 400 #endif など。 そうすれば、コンパイラドライバで渡して変えれます。 gcc example.c ./a.out FILESIZE = 6400 gcc -DLOOP=300 example.c FILESIZE = 4800 #! /bin/sh # PARAMS="100 200 300 400 500" for param in $PARAMS ; do echo "=== $param ===" gcc -DLOOP=$param example.c ./a.out done ※ gcc -o で example_100 example_200 ... の様な名前で実行ファイルを作るのが向いてる場合もあるかも
その他の回答 (5)
- D-Matsu
- ベストアンサー率45% (1080/2394)
普通そういうことをするにプログラムへの引数を使います。 mainのargcとargvは飾りじゃありませんよ?
- kmee
- ベストアンサー率55% (1857/3366)
あと、少々強引ですが > #define LOOP 400 <---- ここを実行時に変化させたい。 この行を消しておいて、オプションで指定→コンパイル→実行を繰り返す、という方法もあります。 for l in 400 500 600 do gcc -DLOOP=$I foo.c && a.out done とか。 同様に、sed等でソースコードを書き換えてコンパイル→実行、というのもあります。 値変えるごとにコンパイルするので、効率は悪いですが
お礼
お礼が遅れてすみません。 定数の値が変えられないことはもちろんわかっています。 わかって質問しております。 しかし、データを取るためだけに、いちいちコードを変更したくないのです。 その点で言えば、kmeeさんの方法は原始的ですが良い方法かもしれません。 参考になりました。ありがとうございます。
- kmee
- ベストアンサー率55% (1857/3366)
#defineというのは、プリプロセッサという、コンパイル前に実行されるプログラムで処理されて、本番のコンパイルではすでにその形はありません。 > printf("FILESIZE = %d\n", FILESIZE); は実際コンパイルする際には置き換えられた後の > printf("FILESIZE = %d\n", 400*16); となっています。 コンパイル前に置き換わるのですから、コンパイル後である実行時に変更することはできません。 実行時に変えたいものは、変数を使います。 (C++やC99より前の)配列の大きさなど、定数でなければならないものは、別の手段で代用する必要があります。
- Gotthold
- ベストアンサー率47% (396/832)
定数は変化しないから定数なんですが…。 あなたが使いたいのは変数ではないの?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
コマンドラインからLOOP値を与えちゃいけないんですか? あるいは環境変数やファイルから読み出してはいけないんですか?
お礼
お礼が遅れてすみません。 詳しくコードまで載せて頂いてありがとうございます。 kmeeさんのと合わせて考えて、これがベストの方法だと思いました。 ありがとうございました!