Cの #define ステートメント、またはより具体的には gcc 4.2 のオプションの引数に問題があります。
bool func1(bool tmp) { return false; }
void func2(bool tmp, bool tmp2) {}
#define CALL(func, tmp, ...) func(tmp, ##__VA_ARGS__)
int main() {
// this compiles
CALL(func2, CALL(func1, false), false);
// this fails with: Implicit declaration of function 'CALL'
CALL(func2, false, CALL(func1, false));
}
これは明らかに不自然な例ですが、問題を示しています。オプションの引数を正しく「解決」する方法を知っている人はいますか?
追加情報: ##
beforeを削除して、次の__VA_ARGS__
ようにすると:
bool func2(bool tmp, bool tmp2) { return false; }
#define CALL(func, tmp, ...) func(tmp, __VA_ARGS__)
int main() {
CALL(func2, false, CALL(func2, false, false));
}
それはコンパイルされますが、解決されるため、引数がゼロでは機能しなくなりましたfunc(tmp, )
編集:すべてのコードを変換して、以前のコードの代わりに P99 に依存するようにした直後 (これにより、コードが大幅に壊れてしまいました)、誤ってこれが機能することを発見しました:
bool func1(bool tmp) { return false; }
void func2(bool tmp, bool tmp2) {}
#define CALL2(func, tmp, p...) func(tmp, ##p)
#define CALL(func, tmp...) CALL2(func, tmp)
int main() {
// works
CALL(func2, CALL(func1, false), false);
// ...also works
CALL(func2, false, CALL(func1, false));
}
任意の数のパラメーターをコンパイルして動作します (そして正しい値が渡されて返されます)、しかし...これは合法であると考えられますか?