2017-05-26 19 views
1

如果我打算使用的東西,只是聲明_GNU_SOURCE後提供的,做我需要項目中的所有源文件的頂部聲明_GNU_SOURCE在整個項目中應該定義_GNU_SOURCE嗎?

是否安全僅在任何需要它的源文件的頂部聲明呢?

我最初關注的是有關類型聲明......這當然是可能的,一個struct變化定義_GNU_SOURCE後的形狀,但是是有可能的,抑或是保證這樣的事情「不會改變形狀」?

例如,如果我使用struct在一個文件(帶有_GNU_SOURCE)聲明變量,然後使用該變量在另一個(沒有_GNU_SOURCE),保證了我不會碰到的問題?


在這種情況下,我在pthread_tryjoin_np()之後。

+0

如果您的編譯器是'gcc',那麼您可以使用選項:'-std = gnu11'然後編譯器就會像編寫glibc的每個'feature test macros'一樣編寫,包括'__GNU_SOURCE'宏。那麼你不必擔心你的問題中提到的細節。 – user3629249

回答

4

僅在需要它的文件中聲明它是安全的。

畢竟,整個問題的關鍵在於如果定義了某些代碼,它仍然需要與使用它的代碼鏈接。

正如@IanAbbott所指出的那樣,例外是當你在界面中使用一些不同的類型。然後,您需要保持使用它的模塊的定義一致。例如。 off_t變成_GNU_SOURCE,別名爲off64_t,所以如果您隨後包含與_GNU_SOURCE關閉相同的標題,它將定義不同的功能。

也就是說,在一個項目中,沒有什麼理由不把它定義在任何地方,因爲一旦你在任何文件中定義它,你就依賴它。因此,如果它在一個可選組件中,或者如果您有其他使用特定於那些其他系統的功能的系統的替代品,那麼在本地定義它只會有所幫助。

+4

這取決於。定義'_GNU_SOURCE'還會選擇大文件支持,影響'off_t'等類型,並更改使用'off_t'(如'lseek','pread'等)映射到的「普通」函數的哪些函數。這可能是也可能不是問題,具體取決於使用它們的代碼,以及目標是否具有本地大文件支持而不顯式請求它。 –

相關問題