2012-02-27 72 views
6

我修改的Qemu的源代碼,創建這樣GCC錯誤消息:嘗試使用招「TARGET_I386」

#if defined(TARGET_I386) 
    /* some defines */ 
#elif defined(TARGET_ARM) 
    /* some other defines */ 
#endif 

然後,這個文件包含在vl.c文件,和gcc報告以下錯誤信息:

error: attempt to use poisoned "TARGET_I386" 
error: attempt to use poisoned "TARGET_ARM" 

TARGET_I386在另一頭文件中定義並且在其它QEMU的源文件被使用。

此錯誤信息的含義是什麼?

更新:

正如馬提亞維爾納提到的,這些定義不應當被用於目標獨立代碼。這些毒物標識在poison.h

回答

11

定義顯然標識符已被標記爲中毒

GCC Documentation

的#pragma GCC毒

有時候,還有就是你想從完全刪除的標識符你的程序,並確保它永遠不會爬回來。爲了強制執行此操作,可以使用此附註毒化標識符。 #pragma GCC中毒後面跟着一個要毒害的標識符列表。如果這些標識符中的任何一個出現在指令之後的源中的任何位置,這是一個嚴重錯誤。

例如,

#pragma GCC poison printf sprintf fprintf 
sprintf(some_string, "hello"); 

將產生錯誤。

如果中毒標識符作爲在標識符中毒之前定義的宏的擴展的一部分出現,它不會導致錯誤。這可以讓你中毒標識符,而不用擔心定義使用它的宏的系統頭文件。

例如,

#define strrchr rindex 
#pragma GCC poison rindex 
strrchr(some_string, 'h'); 

不會產生錯誤。

4

構建目標獨立代碼時,不應使用QEMU中的毒藥標識符。

+0

這個答案比我的好,它解釋了錯誤發生的原因,而不是如何解釋。 – 2012-02-27 14:48:18