Cで、define文で値を指定することがあると思います。
シェルスクリプトあたりを使って、define文で指定される定数のパラメータを変化させて、自動でパラメータを変化させてデータを取りたいです。
そのようなときにはどのように記述すればよいのでしょうか?
たとえば、下のような場合です。
環境はlinuxです。
よろしくお願いします。
////////////////////////////////////////
#define LOOP 400 <---- ここを実行時に変化させたい。
#define FILESIZE LOOP*16
int main(int argc, char** argv){
printf("FILESIZE = %d\n", FILESIZE);
}
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 ... の様な名前で実行ファイルを作るのが向いてる場合もあるかも
お礼が遅れてすみません。
詳しくコードまで載せて頂いてありがとうございます。
kmeeさんのと合わせて考えて、これがベストの方法だと思いました。
ありがとうございました!
No.4
- 回答日時:
あと、少々強引ですが
> #define LOOP 400 <---- ここを実行時に変化させたい。
この行を消しておいて、オプションで指定→コンパイル→実行を繰り返す、という方法もあります。
for l in 400 500 600
do
gcc -DLOOP=$I foo.c && a.out
done
とか。
同様に、sed等でソースコードを書き換えてコンパイル→実行、というのもあります。
値変えるごとにコンパイルするので、効率は悪いですが
お礼が遅れてすみません。
定数の値が変えられないことはもちろんわかっています。
わかって質問しております。
しかし、データを取るためだけに、いちいちコードを変更したくないのです。
その点で言えば、kmeeさんの方法は原始的ですが良い方法かもしれません。
参考になりました。ありがとうございます。
No.3
- 回答日時:
#defineというのは、プリプロセッサという、コンパイル前に実行されるプログラムで処理されて、本番のコンパイルではすでにその形はありません。
> printf("FILESIZE = %d\n", FILESIZE);
は実際コンパイルする際には置き換えられた後の
> printf("FILESIZE = %d\n", 400*16);
となっています。
コンパイル前に置き換わるのですから、コンパイル後である実行時に変更することはできません。
実行時に変えたいものは、変数を使います。
(C++やC99より前の)配列の大きさなど、定数でなければならないものは、別の手段で代用する必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
math.hに含まれる関数が使えない
-
C言語なうなんですが、コンパイ...
-
Verilog_HDLでのdefineとifdef
-
C#で char型とstring型の比較で...
-
SHBrowseForFolderA
-
共有ライブラリの内容確認について
-
gcc コンパイル killed
-
c言語です コンパイルした時に...
-
メッセージボックスのEXEを作る...
-
Cのコンパイルでコメントアウト...
-
VBでC言語の#ifdefの様な事がし...
-
C言語で、配列を使ったsinカー...
-
C90とC99の計算結果の違い?
-
コンパイル時に「out of memory...
-
実行後にコンパイルに失敗しま...
-
#defineとconstについて
-
i386 or x86_64 のどちらを選...
-
C++のvectorについて教えてくだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
<math.h>ヘッダを入力している...
-
C#で char型とstring型の比較で...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
[COBOL] ソースの復帰
-
64ビットのlinuxで32ビットメモ...
-
gcc バージョン違いによるコン...
-
VS2010環境で2点ほど質問
-
ヘッダーファイル『windows.h』...
-
C言語で作ったらWindowsでもMac...
-
自作DLLの中身を暗号化
-
MVSマシンで0C7でABENDしたので...
-
Verilog_HDLでのdefineとifdef
おすすめ情報