3

私は、ANSI準拠のコンパイラ(Microchip XC8)でPICMCUプログラムを開発しています。コンパイル時にマクロを介して決定される2つの操作モードがあります。1行のコードで1つの関数のようなマクロを複製したくないので、次のようなマクロを作成する方法があるかどうかを知りたいです。

#define FOO //

そのため、FOOが置き換えられると、実際には残りの行がキャンセルされます。

マクロの代わりに関数を書くことは問題外です。なぜなら、関数呼び出しによって生成される遅延は、私のプログラムのタイトなタイミング(数マイクロ秒程度)を混乱させるからです。

4

4 に答える 4

5

ディレクティブを使用して#ifndef、同じ効果を達成できます。

#ifndef FOO
   your_line_of_code
#endif

編集:@SteveJessopは、OPのこの文に注意を払っていないことを私に見せてくれました。 「1行のコードのために1つの関数のようなマクロを複製したくない」。関数のようなマクロを複製したくない場合は、次のように実行できます。

// When FOO is defined, BLA in FUNC macro is a no-operation (null statement)

#ifndef FOO
#define BLA() a++
#else
#define BLA()
#endif

#define FUNC()  \
   BLA();       \
   b++;
于 2012-06-12T19:20:18.753 に答える
5

マクロを展開して行をコメントアウトすることはできません。マクロ定義には、定義に続くコメントがあり、展開されていません。IIRCには、トークンの貼り付けを使用して//作成することはできないという規則があります。//可能であっても、展開してもマクロがコメントを開始するわけではありません。基本的に、マクロを使用してコメント構文を変更することはできません。

あなたができること:

#if DO_NOTHING_MODE
    #define FOO(ARG1)
#else
    #define FOO(ARG1) ARG1
#endif

次のように使用します。

#define FUNCTION_LIKE_MACRO(ARG1, ARG2) \
    required line; \
    FOO(optional line;) \

より一般的なイディオムは、行全体ではなく、式を引数として受け入れるようにマクロを設計することです。

#if DO_NOTHING_MODE
    #define FOO(ARG1) ((void)0)
#else
    #define FOO(ARG1) (ARG1)
#endif

のように使用しますFOO(optional line);

いずれにせよ、マクロ引数にコンマが含まれている場合、呼び出し元はそれらを括弧FOO((1,2))で囲む必要がありますが、C99ではFOO可変個引数マクロを作成することでそれを回避できます。

#define FOO(...) (__VA_ARGS__)
于 2012-06-12T19:41:12.740 に答える
3

マクロの置換が行われる前にコメントがソースから削除されるため、そのようなマクロを正確に定義する方法はありません。ただし、マクロに追加のパラメーターを渡して、生成するコードを指定したり、コンパイルするモードに応じて条件付きでマクロを定義したりすることは確かに可能です。

于 2012-06-12T19:19:39.377 に答える
1
#define FOO(...) __VA_ARGS__

そして、マクロのFOO(your code here)代わりに使用します。FOO your code here

プラットフォームにC99がない場合は、代わりに使用できます

#define FOO(x) x

引数に,で囲まれていないが含まれていないことを確認してください()

于 2012-06-12T19:40:57.360 に答える