6

如果问题看起来太明显或太简单,请道歉。不幸的是,在经历了一堆线程并在谷歌上搜索 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) 上,我收到警告“'visibility' 属性被忽略”
有什么办法可以删除该警告吗?(省略 -Wattributes 不是一种选择)

谢谢!

4

1 回答 1

8

函数类型的 GCCvisibility属性中的 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

当然,这会使 make 不那么干净,因为MY_PREFIX现在应该在每个函数声明中指定它,而不是在 typedef 中指定一次。但这可能是使它工作的唯一方法,除非我错过了什么。

于 2012-10-24T20:47:35.117 回答