6

質問があまりにも明白または単純に思われる場合は、お詫び申し上げます。残念ながら、一連のスレッドを調べて、typedef と属性プレフィックスを組み合わせてグーグルで調べた後でも、まだわかりません。

(おそらく)ポータブルアプリに次のコードスニペットがあります-

#ifdef WIN32
#define MY_PREFIX __declspec(dllexport)
#else
#define MY_PREFIX __attribute__((visibility("default")))
#endif

typedef MY_PREFIX bool some_func(void);

だから私の質問はこれです -
1)そのtypedefは正確に何をしていますか?
2) コードは VS2008 では正常にコンパイルされますが、G++ (gcc-4.1) では、「'visibility' 属性が無視されました」という警告が表示さ
れます。その警告を削除する方法はありますか? (省略 -Wattributes はオプションではありません)

ありがとう!

4

1 に答える 1

8

visibility関数型の GCC 属性の AFAIK は、typedef 型に「ラップ」できません。コンパイラは、このvisibility属性が typedef-name 自体に適用されると想定します。また、GCC はvisibilitytypedef 名をサポートしていません (とにかく必要なものではありません)。

declspec/を typedefにラップしようとする代わりにattribute、関数宣言の時点で明示的に指定する必要があります。のように

#ifdef WIN32
#define MY_PREFIX __declspec(dllexport)
#else
#define MY_PREFIX __attribute__((visibility("default")))
#endif

typedef bool some_func(void);

MY_PREFIX some_func foo; // <- actual declaration

もちろん、これは make のクリーン度を低下させます。なぜならMY_PREFIX、typedef 内で 1 回指定する代わりに、すべての関数宣言で指定する必要があるからです。しかし、何かが欠けていない限り、それがおそらくそれを機能させる唯一の方法です。

于 2012-10-24T20:47:35.117 に答える