2011-09-22 54 views
12

我有一些需要傳入的gcc標誌的遺留代碼。我可以爲這些標誌添加預處理器檢查嗎?如果需要的標誌不存在,則編譯失敗

例如,假設我需要-fno-strict-aliasing,我可以做這樣的事情:

#ifndef _FNO_STRICT_ALIASING 
    #error -fno-strict-aliasing is required! 
#endif 
+0

聽起來像是應該做的事情。 – 2011-09-22 17:07:43

+0

@Code Monkey:當然可以通過make傳遞標誌。但是,如果源代碼轉移到可能會丟失知識的新制作系統(例如,如果您將源代碼分發到lib)。我希望代碼本身知道它需要什麼。這樣更幹。 :) – paleozogt

回答

6

您可以使用

#pragma GCC optimize "no-strict-aliasing" 

編譯文件與標誌(重寫什麼規定上命令行)。 您還可以使用

__attribute__((optimize("no-strict-aliasing"))) 

到源文件中的標誌適用於一個單一的功能...

+0

啊!甚至比我所要求的更好! – paleozogt

+0

最好還是修復需要此標誌的破解代碼,以便它確實有效C. –

+0

哦否:使用沒有嚴格別名的編譯指示不起作用:https://bugzilla.redhat.com/ show_bug.cgi?id = 486176 – paleozogt

3

肯定是有沒有爲它的#define,至少在我的版本的GCC。

要查看所有預定義的處理器符號:

g++ -dM -E - < /dev/null 

我不認爲有什麼辦法來測試這些選項。但是,如果您使用的是GCC 4.4或更高版本,則可以使用"optimize" function attribute"optimize" #pragma在每個功能或每個文件的基礎上啓用特定的選項。

舉例來說,如果你將它添加到一個共同的頭文件:

#if defined(__GNUC__) 
#pragma GCC optimize ("no-strict-aliasing") 
#else 
#error "You are not using GCC" 
#endif 

...它應該能爲每個包含頭文件的選項。

[更新]

行,所以我花了大約10分鐘太長,組成這個答案。無論如何,我將把它留在這裏,以便鏈接到GCC文檔。

+1

哦,不:使用沒有嚴格別名的編譯指示不起作用:https://bugzilla.redhat.com/show_bug.cgi ?ID = 486176 – paleozogt