在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在这方面打破了?
由于系统标头中的类型更改,我在 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"' 以防止重新修改损坏的名称。
有没有更优雅的方法来实现这一点而不会遇到编译器投诉?