【问题标题】:Using __attribute__ with typedef将 __attribute__ 与 typedef 一起使用
【发布时间】:2012-10-24 20:12:07
【问题描述】:

如果问题看起来太明显或太简单,我们深表歉意。不幸的是,经过一堆线程并在谷歌上搜索 typedef 加上 attribute 前缀后,我仍然无法弄清楚。

我在一个(假定的)便携式应用程序中有以下 sn-p 代码 -

#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 不是一个选项)

谢谢!

【问题讨论】:

  • 这看起来不像是有意义的 typedef。你的意思是typedef (MY_PREFIX *some_func)(void)? (另外,C++ 中的(void) 是不合时宜的)
  • 我知道它试图定义一个函数指针。不幸的是,看起来怪异的 typedef 确实可以在 VS2008 上编译。 :-/
  • @sskanitk:不,它不是函数指针。它是一个函数类型。
  • @AndreyT,好的-谢谢。所以一个函数类型应该还是可以使用attribute, rite?

标签: c++ visual-c++ macros g++ typedef


【解决方案1】:

函数类型的 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

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

【讨论】:

  • 好的 - 感谢您的解释。在函数声明后指定属性不起作用 - 再次引发相同的警告。
  • @sskinitk:是的,我也注意到了。您可以在之前和之后指定属性。两种方式都有效,含义不同。
  • 我很惊讶你不能为 typedef 指定可见性,但你可以为结构/类指定可见性。类型在 C++ 中具有链接似乎是一种双重标准,但您不能为通过 typedef 定义的类型指定链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多