我是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");
我得到的错误是“找不到用户定义的文字运算符”,但我并没有真正得到用户定义的文字。 对此有任何解释。
答案 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"));