• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:define文のパラメータを実行時に変化させたい)

C言語でdefine文のパラメータを実行時に変化させる方法

このQ&Aのポイント
  • C言語でdefine文のパラメータを実行時に変化させる方法を紹介します。
  • シェルスクリプトを使用して、define文で指定される定数のパラメータを自動的に変化させることができます。
  • 具体的な例を挙げて説明します。環境はLinuxです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 ... の様な名前で実行ファイルを作るのが向いてる場合もあるかも

g47040
質問者

お礼

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

その他の回答 (5)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

普通そういうことをするにプログラムへの引数を使います。 mainのargcとargvは飾りじゃありませんよ?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

あと、少々強引ですが > #define LOOP 400 <---- ここを実行時に変化させたい。 この行を消しておいて、オプションで指定→コンパイル→実行を繰り返す、という方法もあります。 for l in 400 500 600 do gcc -DLOOP=$I foo.c && a.out done とか。 同様に、sed等でソースコードを書き換えてコンパイル→実行、というのもあります。 値変えるごとにコンパイルするので、効率は悪いですが

g47040
質問者

お礼

お礼が遅れてすみません。 定数の値が変えられないことはもちろんわかっています。 わかって質問しております。 しかし、データを取るためだけに、いちいちコードを変更したくないのです。 その点で言えば、kmeeさんの方法は原始的ですが良い方法かもしれません。 参考になりました。ありがとうございます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

#defineというのは、プリプロセッサという、コンパイル前に実行されるプログラムで処理されて、本番のコンパイルではすでにその形はありません。 > printf("FILESIZE = %d\n", FILESIZE); は実際コンパイルする際には置き換えられた後の > printf("FILESIZE = %d\n", 400*16); となっています。 コンパイル前に置き換わるのですから、コンパイル後である実行時に変更することはできません。 実行時に変えたいものは、変数を使います。 (C++やC99より前の)配列の大きさなど、定数でなければならないものは、別の手段で代用する必要があります。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

定数は変化しないから定数なんですが…。 あなたが使いたいのは変数ではないの?

回答No.1

コマンドラインからLOOP値を与えちゃいけないんですか? あるいは環境変数やファイルから読み出してはいけないんですか?

関連するQ&A