小编Col*_*Rob的帖子

Visual Studio 2015 Update 3是否破坏了构造函数属性?

在VS2015u2中,下面的代码编译得很好.

class Foo {
public:
   [[deprecated]] Foo(std::string);
   Foo();
};
Run Code Online (Sandbox Code Playgroud)

在VS2015u3下,我收到一个错误:

C2416: attribute 'deprecated' cannot be applied in this context
Run Code Online (Sandbox Code Playgroud)

这适用于GCC 5.2,它适用于早期版本的VS2015.当然,弃用的属性实际上并没有在VS2015中触发警告,但这并不是一个重要的问题.

我是否误解了如何将属性应用于构造函数?还是VS2015u3在这方面打破了?

c++ attributes visual-c++ c++14 visual-studio-2015

7
推荐指数
1
解决办法
312
查看次数

C++ 成员函数的 GCC 别名属性

由于系统标头中的类型更改,我在 Linux 上遇到了可移植性问题。siginfo_t 类型已从命名结构 (struct siginfo) 更改为未命名结构。对我来说,这在 RHEL6 和 RHEL7 之间发生了变化。

我们在一些地方使用了ACE,他们在一些公开的接口中使用了 siginfo_t。结果是在 RHEL7 上编译的代码不会链接到在 RHEL6 上构建的库。暂时,我需要支持这个。

在 RHEL6 中,一个问题函数被输入为:

ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*) 
Run Code Online (Sandbox Code Playgroud)

在 RHEL7 中,它看起来像这样:

ACE_Event_Handler::handle_signal(int, siginfo_t*, ucontext*) 
Run Code Online (Sandbox Code Playgroud)

它们被分解成不同的符号,导致链接期间失败或运行时符号查找失败。

一个相对简单的解决方案是使用函数别名。但是,我不想修改头文件。我有点挣扎,因为这是一个虚拟成员函数。

我尝试在基于 RHEL7 的 ACE 版本上的 Event_Handler.cpp 中执行此操作:

struct siginfo;
ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*)
__attribute__((
  alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));
Run Code Online (Sandbox Code Playgroud)

有了这个,GCC 抱怨该函数没有被声明。我最终能够完成这项工作,但只有通过这个丑陋的黑客:

extern "C" int _ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext()
__attribute__((
  alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));
Run Code Online (Sandbox Code Playgroud)

需要'extern "C"' 以防止重新修改损坏的名称。

有没有更优雅的方法来实现这一点而不会遇到编译器投诉?

c++ alias attributes gcc abi

5
推荐指数
0
解决办法
1602
查看次数

标签 统计

attributes ×2

c++ ×2

abi ×1

alias ×1

c++14 ×1

gcc ×1

visual-c++ ×1

visual-studio-2015 ×1