LLVM的clang/clang++允许您
specify attributes for entire regions of code
. 语法如下:
// the following works fine under clang:
#pragma clang attribute push(__attribute__((target("sse4.2"))), apply_to=function)
void f(){}
#pragma clang attribute pop
f
将在支持SSE4.2指令集的情况下编译。这将适用于
attribute push
和
attribute pop
.
如果我们添加一个命名空间呢?
namespace joe {
#pragma clang attribute push(__attribute__((target("sse4.2"))), apply_to=function)
void g() {}
#pragma clang attribute pop
}
它失败了
'error: expected unqualified-id'
. 显然是关键词
attribute
编译器不需要。
考虑到名称空间有多常见,这个问题有些出乎意料。当然,可以避免使用名称空间来解决这个问题,但这有点不雅观。
我已经用所有最新的LLVM clang++编译器(最高8.0)验证了这个问题。
I have created a gist to illustrate the issue
.