很长一段时间我用gcc
来编译C代码。有时我必须使用optimize("O0")
属性来禁用特定函数的优化。现在我喜欢用clang
。
假设以下代码:
#include <stdio.h>
void __attribute__((optimize("O0"))) blabla(void) {
}
int main(void) {
blabla();
return 0;
}
如果我用clang
编译它,我会收到此错误:
test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("O0"))) blabla(void) {
^
1 warning generated.
然后我使用谷歌(以及)stackoverflow找出clang
需要什么属性,因为其中许多属性不在标准中(我知道)。
我找到了这个帖子: In clang, how do you use per-function optimization attributes?
如果我尝试属性optimize("0")
,我会收到此错误:
test2.c:3:21: warning: unknown attribute 'optimize' ignored [-Wattributes]
void __attribute__((optimize("0"))) blabla(void) {
^
1 warning generated.
如果我尝试属性optnone
,我会收到此错误:
test2.c:3:21: warning: unknown attribute 'optnone' ignored [-Wattributes]
void __attribute__((optnone)) blabla(void) {
^
1 warning generated.
我还尝试在函数名后面移动属性,但它不起作用(由于某种原因,有关于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.
使用以下代码进行的另一项测试:
#include <stdio.h>
[[clang::optnone]]
void blabla(void) {
}
int main(void) {
blabla();
return 0;
}
它产生:
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.
可能我做错了什么,但我看不清楚。
-edit -
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
答案 0 :(得分:3)
尝试以下clang-style属性规范:
[[clang::optnone]]
void blabla(void);
编辑:Clang 3.3已经过时了。使用更新版本,原始((optnone))
代码即可使用。