如何将#pragma clang 属性推送与 C++ 命名空间一起使用?

Dan*_*ire 5 clang clang++

LLVM 的 clang/clang++ 允许您为整个代码区域指定属性。语法如下:

    // the following works fine under clang:
    #pragma clang attribute push(__attribute__((target("sse4.2"))), apply_to=function)
    void f(){}
    #pragma clang attribute pop
Run Code Online (Sandbox Code Playgroud)

在此示例中,该函数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
    }
Run Code Online (Sandbox Code Playgroud)

它失败了'error: expected unqualified-id'。显然attribute,编译器不需要关键字。

鉴于命名空间的常见程度,这个问题有点出乎意料。当然,可以避免命名空间来解决这个问题,但这有点不雅。

有更好的解决方法吗?

我已经用所有最近的 LLVM clang++ 编译器(最高 8.0)验证了这个问题。

我创建了一个要点来说明这个问题

小智 0

这似乎在 clang 9 (2019-09) 中有效,但在之前无效: https: //gcc.godbolt.org/z/okfDiS