0

我想为 IBM Metal C Prolog 创建参数化预处理器宏。

最初的未参数化形式是 #pragma prolog(Foo, " #MCPROLG MAIN=(YES,16,132)") 真正的序言更复杂,但为了这个问题,重要的部分是字符串中有值。

#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需要保留在字符串中,以便其 # 不被视为字符串化标记。

4

1 回答 1

1

要解决问题 1(需要在替换列表中展开参数),您需要一个间接字符串化宏:

#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)\"")
于 2017-11-10T15:24:37.353 回答