21

内部で廃止予定のルーチンに関する特定の警告を簡単に (設定を解除して) マクロを追加したいと思います。

私はこれを変えたい:

#pragma clang diagnostic push
#pragma clang diagnostic warning "-Wdeprecated-declarations"

void Foo() __attribute__((deprecated("Warning: deprecated routine")))

#pragma clang diagnostic pop

これに:

MY_DEPRECATED_BEGIN

void Foo() MY_DEPRECATED

MY_DEPRECATED_END

1 つのマクロで2 つのプラグマMY_DEPRECATED_BEGINを指定する必要があるため、マクロが問題を引き起こしています。これはできますか?

(MY_DEPRECATED マクロのみを使用して同じ効果を達成するソリューションのボーナス ポイント!)

4

2 に答える 2

23
void Foo() __attribute__((deprecated));

#define MY_DEPRECATED_BEGIN \
    _Pragma("clang diagnostic push") \
    _Pragma("clang diagnostic warning \"-Wdeprecated-declarations\"")


int main()
{
MY_DEPRECATED_BEGIN
    Foo();
#pragma clang diagnostic pop
}

あなたの技術的な質問に対する簡単な答えは、C99 が提供する_Pragma("foo")構造体と同等ですが#pragma foo、少し後で処理され、それ自体で行にある必要はないということです。

あなたの他の問題は、-Wdeprecated-declarationsあなたが思っていることをしないということです。関数を非推奨として宣言するだけでは、 (通常はヘッダー ファイルで) 使用されること__attribute__((deprecated))なっているため、診断が得られることはありません。診断の原因は、非推奨の関数を使用した場合です。その時点で、の設定が適切に-Wdeprecatedなります。

Foo本当にiffが設定されている場合は非推奨にするだけの場合MY_DEPRECATED、正しい方法は次のとおりです

#ifdef MY_DEPRECATED
 #define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
 #define ATTRIBUTE_DEPRECATED
#endif

void Foo() ATTRIBUTE_DEPRECATED;
于 2013-01-23T01:43:44.200 に答える