将__attribute__与typedef一起使用

ssk*_*itk 6 c++ macros typedef g++ visual-c++

如果问题看起来太明显或简单,请道歉.不幸的是,经过一堆线程和谷歌搜索关于typedef加上属性前缀,我仍然无法弄明白.

我在(据称)便携式应用程序中有以下代码片段 -

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

typedef MY_PREFIX bool some_func(void);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 -
1)那个typedef究竟在做什么?
2)代码在VS2008上编译正常,但在G ++(gcc-4.1)上,我收到警告"'visibility'属性被忽略"
有什么方法可以删除该警告吗?(省略-Wattributes不是一个选项)

谢谢!

AnT*_*AnT 8

visibility函数类型的GCC 属性中的AFAIK 不能"包装"为typedef-ed类型.编译器假定此visibility属性适用于typedef-name本身.并且GCC不支持visibilitytypedef名称(并且它不是你需要的).

我要说的是,不应该尝试将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
Run Code Online (Sandbox Code Playgroud)

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