簡體   English   中英

運行GCC預處理器非C文件

[英]Run GCC preprocessor non-C files

我正在使用專有的開發環境來編譯用C編寫的代碼以及IEC 61131語言。 對於C編譯,它使用GCC 4.1.2和這些構建選項:

-fPIC -O0 -g -nostartfiles -Wall -trigraphs -fno-asm

編譯是由使用Cygwin在Windows上運行的程序完成的。

我的問題是,IEC語言預處理器沒那么有用(根本不支持#define),我想使用宏! 我不明白為什么GCC預處理器真正關心它正在處理什么語言(我的目標語言是結構化文本),所以我想看看是否有人知道如何讓它來處理不同文件類型的文件然后不進一步編譯(我只是在文件通過IEC編譯器運行之前尋找宏擴展)。 我對編譯器選項和環境一無所知,因為我從來沒有處理它們,我只是編寫C代碼並且它神奇地編譯並傳輸到我的目標系統來運行。

我唯一能做的就是添加構建選項並在執行任何操作之前執行批處理文件。 我認為我最大的希望在於使用批處理文件來處理某個擴展名的所有文件,但我甚至不知道gnuinst文件夾中要使用哪些可執行文件,更不用說用於運行文件的標志。

幾乎任何C預處理器,包括gcc的cpp ,都會假設它的輸入是有效的C代碼。 它必須按照C(或C ++或Objective-C)規則對輸入進行標記,因為它必須將其輸入解析為標記(更准確地說是預處理標記)。 在令牌級別之上的構造不應該是一個問題。

您當然可以使用cppgcc -E來預處理非C源代碼的文本,但某些輸入結構會導致問題。

以評論為例:

$ cat foo.txt
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"

((2) + (3))

請注意,我必須使用gcc -E - < foo.txt而不是gcc -E foo.txt ,因為默認情況下gcc會將.txt文件視為鏈接器輸入文件。

但是,如果向foo.txt中添加一些不包含有效C預處理程序令牌的內容,則可能會出現問題:

$ cat foo.txt 
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
ADDTHEM('c, "s)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"

((2) + (3))
<stdin>:3:9: warning: missing terminating ' character [enabled by default]
<stdin>:3:0: error: unterminated argument list invoking macro "ADDTHEM"
ADDTHEM

(嘗試將Ada源代碼提供給C預處理器遇到了這種問題,因為Ada使用了孤立的撇號'字符作為其屬性語法。)

因此, 如果輸入語言不使用無效的C預處理程序標記,則可以執行此操作。

有關預處理令牌的更多信息,請參閱C標准的N1570草案 ,第6.4節。

在我檢查GNU cpp手冊之前,我實際上已經寫了上述內容,其中說:

C預處理器僅用於C,C ++和Objective-C源代碼。 在過去,它被濫用為一般的文本處理器。 它會阻塞不遵守C的詞匯規則的輸入。 例如,撇號將被解釋為字符常量的開頭,並導致錯誤。 此外,您不能依賴它來保留對C系列語言不重要的輸入特性。 如果預處理了Makefile,則將刪除所有硬選項卡,並且Makefile將不起作用。

話雖如此,你可以經常在不使用C的東西上使用cpp。其他Algol-ish編程語言通常是安全的(Pascal,Ada等)。所以是匯編,謹慎。 `-traditional-cpp'模式保留更多的空白區域,否則更寬松。 通過編寫C或C ++樣式注釋而不是本地語言注釋,並保持宏簡單,可以避免許多問題。

只要有可能,您應該使用適合您所編寫語言的預處理器。現代版本的GNU匯編程序具有宏功能。 大多數高級編程語言都有自己的條件編譯和包含機制。 如果所有其他方法都失敗了,請嘗試使用真正的通用文本處理器,例如GNU M4。

(該手冊的作者顯然錯過了Ada屬性語法的問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM