Извиняюсь, если вопрос кажется слишком очевидным или простым. К сожалению, после прохождения множества потоков и поиска в Google по поводу 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) я получаю предупреждение
Атрибут «видимость» игнорируется »
Можно ли как-нибудь убрать это предупреждение? (Опускать -Wattributes не вариант)
Спасибо!
AFAIK в GCC visibility
атрибут для типа функции не может быть «обернут» в тип с определением типа. Компилятор предполагает, что это visibility
Атрибут применяется к самому typedef-имени. И GCC не поддерживает visibility
для имен typedef (и это не то, что вам нужно в любом случае).
Я бы сказал, что вместо того, чтобы пытаться обернуть declspec
/attribute
в typedef, это должно быть указано явно в точке объявления функции. Как в
#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
Это, конечно, сделает менее чистым, так как вместо указания MY_PREFIX
когда-то внутри typedef это теперь должно быть указано в каждом объявлении функции. Но это, пожалуй, единственный способ заставить его работать, если я что-то упустил.
Других решений пока нет …