1

コマンド ラインからプログラムを実行するときに、ブール値マクロの値を変更するにはどうすればよいですか? たとえば、cpp ファイルに次のマクロがあるとします。これを MyCpp.cpp と呼びます。

#define DEBUG 1

プログラムを実行するときにこれを変更するにはどうすればよいですか? コマンドラインから:

g++ -Wall -Wextra -o MyCpp MyCpp.cpp

なんらかのコマンド ライン オプションを指定していると思いますが、これで問題はありませんか? また、私は使いたくないargv[]

4

3 に答える 3

5

まず、ソース コードを次のように変更します。

#ifndef DEBUG
#  define DEBUG 1
#endif

これで、コマンド ラインで次のように言うことができます。

g++ -Wall -Wextra -o MyCpp MyCpp.cpp -DDEBUG=5
#                                    ^^^^^^^^^

コマンド ライン引数には、ソース コードを入力-DFOO=barするのと同じ効果があります。マクロの不正な再定義を避けるためにガード#define FOO barが必要です。#ifndef


別のマクロの定義を防ぐために、補助マクロを使用することがあります。

#ifndef SUPPRESS_FOO
#  define FOO
#endif

// ... later

#ifdef FOO
// ...
#endif

ここで、コードで定義-DSUPPRESS_FOOないように言いFOOます...

于 2012-09-24T23:06:49.277 に答える
1

コマンド ラインからプログラムを実行するときに、ブール値マクロの値を変更するにはどうすればよいですか?

現状では、できません。プリプロセッサ シンボルを使用しているため、デバッグ情報を出力するかどうかの決定はコンパイル時の決定になります。そのコンパイル時の DEBUG シンボルを、コマンド ラインを解析するか、実行時に読み込まれる構成ファイルを介して、またはその両方で設定する実行時変数に変更する必要があります。

コマンド ラインの解析はそれほど難しくありません。これを行うのに役立つ低レベルの C スタイルのツールがたくさんあります。Boost には、はるかに強力な C++ ベースのスキームがあります。秘訣は、これらのコンパイル時のデバッグの決定を実行時の決定に変更することです。簡単に言うと、それほど難しくありません。その DEBUG プリプロセッサ シンボルをグローバル変数に置き換えるだけです。もちろん、これよりもかなり洗練されたものにすることができます。最終的には、構成可能なログ システムが作成されます。ブーストにもそれがあります。

于 2012-09-24T23:18:38.713 に答える
0

次の点に注意してください。c/cpp ファイルまたはインクルードされたヘッダー ファイルのいずれかにある場合:

#define DEBUG 1

その場合、コンパイラ (makefile) のコマンド ラインを使用してこの定義を変更することはできません。チャンスはまったくありません。cpp ファイルは、コマンド ライン設定を上書きするだけです。

于 2012-09-24T23:42:44.343 に答える