プロが教える店舗&オフィスのセキュリティ対策術

Cで、define文で値を指定することがあると思います。
シェルスクリプトあたりを使って、define文で指定される定数のパラメータを変化させて、自動でパラメータを変化させてデータを取りたいです。
そのようなときにはどのように記述すればよいのでしょうか?

たとえば、下のような場合です。
環境はlinuxです。
よろしくお願いします。

////////////////////////////////////////
#define LOOP 400 <---- ここを実行時に変化させたい。
#define FILESIZE LOOP*16

int main(int argc, char** argv){
printf("FILESIZE = %d\n", FILESIZE);
}

A 回答 (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 ... の様な名前で実行ファイルを作るのが向いてる場合もあるかも
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
詳しくコードまで載せて頂いてありがとうございます。
kmeeさんのと合わせて考えて、これがベストの方法だと思いました。

ありがとうございました!

お礼日時:2011/07/08 22:11

普通そういうことをするにプログラムへの引数を使います。



mainのargcとargvは飾りじゃありませんよ?
    • good
    • 0

あと、少々強引ですが


> #define LOOP 400 <---- ここを実行時に変化させたい。
この行を消しておいて、オプションで指定→コンパイル→実行を繰り返す、という方法もあります。

for l in 400 500 600
do
gcc -DLOOP=$I foo.c && a.out
done
とか。
同様に、sed等でソースコードを書き換えてコンパイル→実行、というのもあります。

値変えるごとにコンパイルするので、効率は悪いですが
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
定数の値が変えられないことはもちろんわかっています。
わかって質問しております。

しかし、データを取るためだけに、いちいちコードを変更したくないのです。

その点で言えば、kmeeさんの方法は原始的ですが良い方法かもしれません。

参考になりました。ありがとうございます。

お礼日時:2011/07/08 22:08

#defineというのは、プリプロセッサという、コンパイル前に実行されるプログラムで処理されて、本番のコンパイルではすでにその形はありません。


> printf("FILESIZE = %d\n", FILESIZE);
は実際コンパイルする際には置き換えられた後の
> printf("FILESIZE = %d\n", 400*16);
となっています。

コンパイル前に置き換わるのですから、コンパイル後である実行時に変更することはできません。

実行時に変えたいものは、変数を使います。
(C++やC99より前の)配列の大きさなど、定数でなければならないものは、別の手段で代用する必要があります。
    • good
    • 1

定数は変化しないから定数なんですが…。



あなたが使いたいのは変数ではないの?
    • good
    • 0

コマンドラインからLOOP値を与えちゃいけないんですか?


あるいは環境変数やファイルから読み出してはいけないんですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!