将__attribute__与typedef一起使用

时间:2012-10-24 20:12:07

标签: c++ visual-c++ macros g++ 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不是一个选项)

谢谢!

1 个答案:

答案 0 :(得分:8)

函数类型的GCC visibility属性中的AFAIK不能“包装”为typedef-ed类型。编译器假定此visibility属性适用于typedef-name本身。并且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

这当然会使得不太干净,因为不是在typedef中指定MY_PREFIX,而是应该在每个函数声明中指定它。但这可能是让它发挥作用的唯一方法,除非我遗漏了一些东西。