2016-01-20 69 views
4

很長一段時間我用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. 

然後我用谷歌(和)計算器,瞭解屬性是需要什麼對於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; 
} 

它產生:

[email protected]:/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. 

可能是我做錯了什麼,但我不能看到什麼。

CNC中

clang版本:

[email protected]:/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

這應該工作。您使用的是哪個版本的鏗鏘聲? http://clang.llvm.org/docs/AttributeReference.html#optnone-clang-optnone –

+1

[this](http://stackoverflow.com/q/26266820/841108)問題 –

+1

的幾乎重複應該是'void blabla (void)__attribute __((optnone)){'我相信。 – Alex

回答

3

嘗試以下,鐺-style屬性規格:

[[clang::optnone]] 
void blabla(void); 

編輯:鏘3.3是非常不合時宜的。使用更新的版本,並且您的原始((optnone))代碼將起作用。

+1

好吧,我會盡力更新鏗鏘:)謝謝你的提示。 –

+0

不幸的是,它需要很多時間來升級Ubuntu(和鏗鏘聲),但儘快我會測試它:) –

+0

鏗鏘聲3.7版的作品:)謝謝:) –