1

ACE ロギング マクロを展開できません。これは初歩的な問題ですが、頭を悩ませることはできません。

可変引数リストを使用して独自の ACE ログ マクロを作成しようとしています。私のコンパイラ (gcc バージョン 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)) は__VA_ARGS__標準をサポートしています。私の現在の定義は次のとおりです。

#define ERROR_PREFIX            ACE_TEXT("ERROR (%T)%?%I")
#define ERROR(FMT,...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT) __VA_ARGS__))

この呼び出しシーケンスを介して呼び出したいもの:

ERROR( "This is an example error in file %s\n", errorString.c_str() )

しかし、次のコンパイルエラーが発生します。

error: expected ‘)’ before ‘errorString’

この問題に対処するには、マクロ定義をどのように修正すればよいですか?

4

1 に答える 1

1

私は ACE に詳しくありませんが、コンマ削除拡張子を探しているようです

#define ERROR(FMT, ...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT), ##__VA_ARGS__))

GNU CPP マニュアルの「 Variadicマクロ」セクションで説明されているように##、コンマの間に挿入すると__VA_ARGS__、マクロが変数引数なしで呼び出された場合にのみ、コンマを削除するという特別な効果があります。したがって、

ERROR("This is an example error");
ERROR("This is an example error %s", string);

それぞれ展開します

ACE_DEBUG((LM_ERROR, ACE_TEXT("This is an example error")));
ACE_DEBUG((LM_ERROR, ACE_TEXT("This is an example error %s"), string));

これはおそらくあなたが望むものです(繰り返しますが、私はACEを知りません)。EGCS 以前のように、非常に古い, ## __VA_ARGS__GCCへの移植性を考慮しない限り、3 つのトークン シーケンス内およびその周囲のスペースは問題になりません。

この機能は GNU 拡張機能であり、clang や、GNU 互換モードが有効になっている EDG フロントエンドを使用するものでもサポートされています。重要なのは、私の知る限り、Microsoft のコンパイラではサポートされていないことです。

(クリスマスが近いので、括弧の中にスペースを入れると赤ん坊のイエスが泣くということも言っておく必要があります。)

于 2012-12-22T15:24:29.950 に答える