Использование __attribute__ с typedef

Извиняюсь, если вопрос кажется слишком очевидным или простым. К сожалению, после прохождения множества потоков и поиска в 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 не вариант)

Спасибо!

5

Решение

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 это теперь должно быть указано в каждом объявлении функции. Но это, пожалуй, единственный способ заставить его работать, если я что-то упустил.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]