如果问题看起来太明显或简单,请道歉。不幸的是,经过一堆线程和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不是一个选项)
谢谢!
答案 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
,而是应该在每个函数声明中指定它。但这可能是让它发挥作用的唯一方法,除非我遗漏了一些东西。