216

特定の数ではなく、任意の数のパラメーターを受け入れるマクロを C で作成したい

例:

#define macro( X )  something_complicated( whatever( X ) )

X任意の数のパラメータ

whateverオーバーロードされており、2 つまたは 4 つのパラメーターで呼び出すことができるため、これが必要です。

マクロを 2 回定義しようとしましたが、2 回目の定義で最初の定義が上書きされました。

私が使用しているコンパイラは g++ (具体的には mingw) です。

4

6 に答える 6

325

C99 方式で、VC++ コンパイラでもサポートされています。

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
于 2009-03-25T02:16:27.753 に答える
44

__VA_ARGS__それを行う標準的な方法です。必要がない場合は、コンパイラ固有のハックを使用しないでください。

元の投稿にコメントできないのは本当に腹立たしいです。いずれにせよ、C++ は C のスーパーセットではありません。C コードを C++ コンパイラでコンパイルするのは本当にばかげています。ドニーがしないことをしないでください。

于 2011-09-04T21:25:30.390 に答える
31

私はそれが可能ではないと思います.二重括弧でそれを偽造することができます...引数を個別に必要としない限り.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
于 2009-03-25T02:14:46.913 に答える
10
#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

コンパイラが可変長マクロを認識しない場合は、次のいずれかを使用して PRINT を削除することもできます。

#define PRINT //

また

#define PRINT if(0)print

1 つ目は PRINT 命令をコメントアウトし、2 つ目は NULL if 条件のために PRINT 命令を防止します。最適化が設定されている場合、コンパイラは次のような実行されたことのない命令を削除する必要があります。または ((void)0);

于 2009-03-26T20:15:23.860 に答える
7

ここでg++について説明しましたが、これはC99の一部であるため、誰にとっても機能するはずです

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

簡単な例:

#define debug(format, args...) fprintf (stderr, format, args)
于 2009-03-25T02:13:59.990 に答える