簡體   English   中英

如何在C預處理器中參數化包含#的單個字符串?

[英]How to parametrize single string containing # in C preprocessor?

我想為 IBM Metal C Prolog 創建參數化預處理器宏。

最初的未參數化形式是#pragma prolog(Foo, " #MCPROLG MAIN=(YES,16,132)")真正的 prolog 更復雜,但對於這個問題,重要的部分是字符串中有值。

#pragma指令本身不能是宏的一部分,所以我用_Pragma替換它: _Pragma("prolog(Foo, \\" #MCPROLG MAIN=(YES,16,132)\\")")

我可以像這樣參數化 Foo:

#define STR(...) #__VA_ARGS__
#define PROLOG(function) _Pragma(STR(prolog( function , " #MCPROLG MAIN=(YES,16,132)")))

如何創建參數化值 16 的宏?

看來我需要在預處理器中連接字符串,我嘗試了以下方法。 都使用這個字符串化宏:

#define STR(...) #__VA_ARGS__
  1. 用 16 替換的標記(讓我們將其命名為size )不能在字符串本身內,以便將其替換。

    #define PROLOG(function, size) _Pragma(STR(prolog( function , " #MCPROLG MAIN=(YES, size ,132)")))

  2. _Pragma 只接受一個字符串,所以我不能像這樣仔細閱讀 C 字符串連接:

    #define PROLOG(function, size) _Pragma(STR(prolog( function , " #MCPROLG MAIN=(YES," #size ",132)")))

  3. 我不能像這樣將 prolog 的整個第二個參數串起來:

    #define PROLOG(function, size) _Pragma(STR(prolog( function , STR( #MCPROLG MAIN=(YES, size ,132)))))

因為#MCPROLG需要保留在一個字符串中,這樣它的# 就不會被視為字符串化標記。

要解決問題 1(需要擴展替換列表中的參數),您需要一個間接 stringify 宏:

#define STR(X) STR_I(X)
#define STR_I(X) #X

如果你願意,你可以做這個可變參數,但這里沒有必要(你的字符串中的逗號用括號括起來;預處理器將匹配那些;例如, FOO(A=(B,C,D)) ,給定FOO是一個函數- 類似宏,有一個參數)。

要解決問題 2,是的,您需要對整個事情進行字符串化。 實際上,沒有像預處理器那樣將字符串文字串聯(因為它在翻譯階段 4 中運行,而字符串文字串聯直到翻譯階段 6 才會發生)。

要解決問題 3,只需從另一個宏生成一個散列(將其根植於一個類似對象的宏,其中#沒有特殊含義):

#define HASH #
#define HASHM() HASH

類似函數的變體允許您在其他東西旁邊產生相同的散列( HASHMCPROLG沒有任何用處; HASH MCPROLG產生# MCPROLGHASHM()MCPROLG產生#MCPROLG )。

這些部分在手,剩下的很容易:

#define PROLOG(FN_,SZ_) _Pragma(STR(prolog(FN_, STR( HASHM()MCPROLG MAIN=(YES,SZ_,132)))))

在這里,我假設您還需要在 pragma prolog 周圍加上一個結束括號,並且在問題中這是一個錯字; 也就是說,它應該是:

_Pragma("prolog(foo, \"#MCPROLG MAIN=(YES,16,132)\")")

...不是:

_Pragma("prolog(foo, \"#MCPROLG MAIN=(YES,16,132)\"")

暫無
暫無

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

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