Clang:不要优化特定功能

Kev*_*ier 6 c optimization gcc clang

很长一段时间我都习惯gcc编译C代码.有时我必须使用该optimize("O0")属性来禁用特定功能的优化.现在我喜欢这样做clang.

假设以下代码:

#include <stdio.h>

void __attribute__((optimize("O0"))) blabla(void) {
}

int main(void) {
    blabla();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我用它编译它clang得到这个错误:

test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("O0"))) blabla(void) {
                    ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

然后我使用谷歌(以及)stackoverflow找出所需的属性clang,因为他们中的许多不在标准(我知道).

我找到了这个帖子: 在clang中,你如何使用每个函数的优化属性?

如果我尝试该属性,optimize("0")我会收到此错误:

test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("0"))) blabla(void) {
                    ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

如果我尝试该属性,optnone我会收到此错误:

test2.c:3:21: warning: unknown attribute 'optnone' ignored [-Wattributes]
void __attribute__((optnone)) blabla(void) {
                    ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

我也尝试在函数名后面移动属性,但它不起作用(由于某种原因,有关于GCC的警告?!):

test2.c:3:34: warning: GCC does not allow optnone attribute in this position on a function definition [-Wgcc-compat]
void blabla(void) __attribute__((optnone)) {
                                 ^
test2.c:3:34: warning: unknown attribute 'optnone' ignored [-Wattributes]
2 warnings generated.
Run Code Online (Sandbox Code Playgroud)

使用以下代码进行的另一项测试

#include <stdio.h>

[[clang::optnone]]
void blabla(void) {
}

int main(void) {
    blabla();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生:

user@ubuntu:/tmp/optxx$ clang test2.c
test2.c:3:1: error: expected identifier or '('
[[clang::optnone]]
^
test2.c:3:2: error: expected expression
[[clang::optnone]]
 ^
test2.c:8:5: warning: implicit declaration of function 'blabla' is invalid in C99 [-Wimplicit-function-declaration]
    blabla();
    ^
1 warning and 2 errors generated.
Run Code Online (Sandbox Code Playgroud)

可能我做错了什么,但我看不出来.

-编辑-

clang 版:

user@ubuntu:/tmp/optxx$ clang -v
Ubuntu clang version 3.3-16ubuntu1 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 5

试试下面的 clang 风格的属性规范:

[[clang::optnone]]
void blabla(void);
Run Code Online (Sandbox Code Playgroud)

编辑:Clang 3.3 已经过时了。使用更新的版本,您的原始((optnone))代码将起作用。