三元连接宏

时间:2016-03-11 11:29:21

标签: c macros ternary-operator

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

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

当xml为true时,我想要“XML_”前缀。否则我想要“PSYS_”前缀。我已经尝试了

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

我这样称呼宏:

transaction = setTxPrefix(1, "TransactionString");

我得到的错误是“找不到用户定义的文字运算符”,但我并没有真正得到用户定义的文字。 对此有任何解释。

2 个答案:

答案 0 :(得分:3)

您必须使用#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");

答案 1 :(得分:2)

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

C会将两个相邻的字符串文字视为单个字符串,因此这应该按照您的意愿执行:

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

如果第二个参数是字符串文字,则此方法有效:

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