2011-04-08 57 views
3

這是C宏觀怪異問題。C預處理器可以執行簡單的字符串操作嗎?

是否可以編寫一個以字符串常量X(「...」)作爲參數並計算出相同長度的Y,以使Y的每個字符都是[常量] X的對應字符的算術表達式

這是不可能的,對吧?

+7

更好的問題是:「爲什麼在2011年仍有人試圖濫用C預處理器?」。 – 2011-04-08 21:16:41

+9

這是個好問題@保羅。濫用模板被稱爲「元編程」。濫用預處理器的時刻將獲得科學的,神祕的名字,它將成爲可敬的,書籍出版和擴大話題。我的入口是「語法變體」。但你可以嘗試用更好的單詞來打敗我。 – Andrei 2011-04-08 22:10:32

+0

如果您使用perl作爲預處理器... – 2013-02-26 05:15:12

回答

5

不,C預處理器認爲字符串文字是單個標記,因此它不能執行任何此類操作。

你所要求的應該在實際的C代碼中完成。如果您擔心運行時性能並希望在編譯時委託此固定任務,那麼現代優化編譯器應成功處理這樣的代碼 - 它們可以展開任何循環並預先計算任何固定表達式,同時還可以使用代碼大小和CPU高速緩存使用模式考慮在內,預處理器不知道該模式。另一方面,你可能希望你的代碼包含這樣一個修改的字符串,但不想或不需要原始的 - 例如,您希望將程序解碼後的文本混淆,並且您不希望在可執行文件中包含原始字符串。在這種情況下,可以使用一些構建系統腳本來實現這一點,例如,使用另一個C程序生成修改後的字符串,並在C編譯器命令行中將它們定義爲實際程序的宏。

+0

編譯器不太可能在編譯時使用轉換後的字符串替換字符串。 – 2011-04-08 21:27:56

+0

+1更好的答案。 – 2013-05-26 07:09:51

+0

編譯時字符串操作有合法的原因。 – user877329 2017-05-28 08:40:49

0

正如其他人所說,預處理器將整個字符串視爲標記。只有一個例外_Pragma運算符,該運算符將字符串作爲參數並標記其內容以將其傳遞給#pragma指令。

因此,除非您的目標是_Pragma,否則在預處理階段完成任務的唯一方法是將它們寫爲標記序列,操縱它們並在最後對其進行串聯化。