可変引数マクロ(可変個の引数を)作る方法
-
22-08-2019 - |
質問
私は、任意の数のパラメータを受け付けCでマクロを書きたい、ではない特定の番号
例:
#define macro( X ) something_complicated( whatever( X ) )
X
パラメータの任意の数である
whatever
がオーバーロードされ、2つのまたは4のパラメータで呼び出すことができますので、私はこれを必要とします。
私は二回マクロを定義しようとしたが、2番目の定義は、最初の1を上書きした!
私が働いているコンパイラが++ gである(具体的には、mingwの)
解決
C99の方法、また、C ++コンパイラによってサポートされます。
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
他のヒント
__VA_ARGS__
はそれを行うための標準的な方法です。あなたが持っていない場合は、コンパイラ固有のハックを使用しないでください。
私は、元の記事にコメントすることはできませんことを、本当にイライラです。いずれにしても、C ++は、C ++コンパイラを使用してCコードをコンパイルすることは本当に愚かであるCのスーパーセットではありません。ドニーはしないでください何をしないでください。
私はそれが可能だとは思わない、あなたは二重の括弧でそれを偽...ちょうど限り、あなたは、個別の引数を必要としませんでした。
#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
#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
印刷指示うち最初のコメントは、第二のためにNULL条件場合の印刷指示を防ぎます。最適化が設定されている場合、コンパイラは次のように決して実行されなかった命令を取り除く必要があります:if(0)印刷(「こんにちは世界」);または((ボイド)0);
は、それがC99の一部ですが、誰ものために働く必要があり、ここでG ++のために説明します。
http://www.delorie.com/gnu/docs/gcc /gcc_44.htmlする
簡単な例:
#define debug(format, args...) fprintf (stderr, format, args)
所属していません StackOverflow