2013-03-08 451 views
2

我知道inlcude_next碰巧是C預處理器的GNU擴展。 我正面臨使用MSVC編譯Gnu庫代碼的問題。例如,有一個stdio.h頭文件或者GNU-like <stdio.h>。當使用MS編譯器編譯時,我得到了invalid preprocessor command 'include_next'這很好,因爲沒有什麼像windows的#include_next指令。做#include_next的主要目的是希望在你的項目中創建一個名爲stdio.h的文件,並且將會包含這個文件,而不是默認的頭文件。include_next在MSVC中導致問題的預處理器指令

所以,我試了2個選項: 1)在所有文件中註釋掉這一行// #include_next <stdio.h>。 2)或者用##include <stdio.h>替換#include_next。

我不知道是否選擇1)會導致任何問題(最終鏈接器錯誤)。 關於2),我得到了fatal error C1014: too many include files : depth = 1024這也很好。爲此,我將使用wrapper #ifndef作爲包括警衛# pragma once指令。

以下是我的顧慮:

我是否需要寫這樣#include <stdio>或​​頭文件stdio.h裏面的聲明?編譯Windows時它有什麼意義嗎?直接在需要的所有源文件中直接執行​​是否足夠了,這樣它就可以繞過Visual C標準頭,而使用我的? 而且,如果我完全省略語句include_next,可能會發生什麼?

我的主要目標是成功編譯使用MSVC的GNU庫。 如果我錯過了某些東西或者可能會更多地瞭解這個主題,請糾正我。

+0

「我的目標是成功編譯使用MSVC的gnu庫」 - 請參閱http://gnuwin32.sourceforge.net/ – 2013-03-08 13:31:30

+0

@roger_rowland我的意思是我所擁有的代碼具有include_next。他們不是確切的GNU圖書館。我可以從上面的鏈接中使用。但應用程序需求是不同的 – Capricorn 2013-03-08 13:36:42

回答

3

選項1和2都不起作用。它是一個包裹系統的標題。因此,如果您將其註釋掉,系統標題將不會包含在內,並且定義將會丟失。如果您將其更改爲普通#include,它將再次包含相同的標題,導致無限循環。

升壓使用

#include <../include/stdio.h> 

這部作品在WinNT,因爲所有的標準頭恰巧在目錄中稱爲include。它也適用於標準的WinCE SDK,但不幸的是它們不適用於所有這些SDK。

+0

好的kludge - 反正#include_next [記錄](https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html)。 – Tibo 2017-03-01 09:34:07