2009-08-27 47 views
2

我從GNU核心utils的代碼工作,並發現無效使用()函數顯然與設置屬性「不返回的」。那麼,我正在修改函數,我希望它返回(我將呼叫移除到exit())。編譯器仍然抱怨「noreturn」函數返回,並且在使用Eclipse CDT調試器時,跳過代碼是異常的 - 我跳過了代碼行。我沒有看到在.c文件中設置的功能,並且這個.c文件沒有.h文件。這裏是C函數屬性設置(如何取消設置)用gcc

該文件是df.c.我已經重命名文件df_call.c。編譯器如何找到這個屬性?我怎樣才能解除它?

謝謝。

======= 感謝他們的幫助所有貢獻者!簡短的回答是:「GNUutils 7.4中的usage()函數在system.h中原型爲 'void usage(int status)ATTRIBUTE_NORETURN'。我的問題,但留下了修改system.h中的問題

長的答案是:。GNU C編譯器支持的功能 (見http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html),其中一個是 分配屬性「不返回的」語法是「屬性((noreturn))」 (請參閱http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax) 但通常是宏'ATTRIBUTE_NORETURN。如果屬性設置,並在這種情況下一個 試圖從函數返回,可執行文件編譯與投訴,但 編譯和運行。然而,它會出乎意料地行爲(跳過我的案例中的 src行,可能是由於優化)。 Eclipse CDT中的調試器實際上跳過了 代碼行,導致開發人員懷疑他的感官。

+0

你嘗試通過源__noreturn__(或ATTRIBUTE_NORETURN,這是在我的coreutils能找到在谷歌於codesearch版本Typedef的到)grepping? – 2009-08-27 19:11:59

+0

呃,應該是__noreturn__',該死的降價。 – 2009-08-27 19:12:34

+0

我建議在該目錄中爲'usage'做一個「grep」:) – 2009-08-27 19:19:27

回答

1

我會建議預處理源文件,以便讓翻譯單元的所有內容都可供您使用。從那裏我會搜索usage以查看gcc屬性可能來自哪裏。您還應該檢查可能影響您的函數聲明的可能的gcc命令行參數和/或宏。

+0

我直接調用gcc,所以我沒有執行任何編譯行爲,實際上我使用的是最小參數。 – cvsdave 2009-08-27 19:35:32

0

運行gcc -E代替gcc -c並看看結果。幸運的是,那裏會有清晰的noreturn屬性。

另一種選擇是做我所做的,這是避免使用gcc特定的擴展。

gcc -std=c99 -pedantic 

可能會馴服野獸。