三元级联宏
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"));
我是 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"));