三元级联宏

Ternary concatenation macro

我是 C 语言的新手,我正在尝试定义一个为 char* 设置前缀的宏(我仍然将其视为一个字符串,我认为这可能是造成混淆的原因。)

#define setTxPrefix(xml, tx) (xml ? ("XML_" ## tx) : ("PSYS_" ## tx)) 

当xml为真时,我想要"XML_"前缀。否则我想要 "PSYS_" 前缀。我已经试过了

#define setTxPrefix(xml, tx) (xml ? ((char*)"XML_" ## tx) : ((char *)"PSYS_" ## tx)) 

我是这样调用宏的:

transaction = setTxPrefix(1, "TransactionString");

我得到的错误是 "user-defined literal operator not found",但我真的不明白这里的用户定义文字是什么。 对此的任何解释将不胜感激。

您必须使用 #tx 连接到现有字符串。在这种情况下 "XML_" 或 "PSYS_"。因此,宏的代码将是:

#define setTxPrefix(xml, tx) (xml ? ("XML_" # tx) : ("PSYS_" # tx)) 

调用宏的代码不应该有引号:

transaction = setTxPrefix(1, TransactionString);

如果宏中的字符串中有空格,那么您可以使用 C 的一个有趣特性。即,源代码中的字符串连接成为程序中的连接字符串。所以你可以这样改变宏:

#define setTxPrefix(xml, tx) (xml ? ("XML_" tx) : ("PSYS_" tx)) 

调用宏的代码会有引号:

transaction = setTxPrefix(1, "TransactionString");

使用 ## 的令牌粘贴用于从子令牌创建有效的 C 令牌。你不能在这里使用它,因为你对字符串文字进行操作。

C 会将两个相邻的字符串文字视为一个字符串,因此这应该符合您的要求:

#define setTxPrefix(xml, tx) (xml ? ("XML_" tx) : ("PSYS_" tx)) 

如果第二个参数是字符串文字,这将起作用:

puts(setTxPrefix(0, "Transaction"));
puts(setTxPrefix(1, "Transaction"));