c - 三元级联宏

标签 c macros ternary-operator

我是 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");

我得到的错误是“未找到用户定义的文字运算符”,但我真的不知道这里的用户定义文字是什么。 对此的任何解释将不胜感激。

最佳答案

您必须使用 #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 - 三元级联宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35939130/

相关文章:

c - 为什么 SUCCEEDED 宏中有这么多括号?

java - 当返回值为int时通过条件运算符返回null

c - 用C语言构建一个漂亮的GUI

c - 将链表附加到另一个链表的末尾

macros - 宏和编译器插件有什么区别?

php - 简单的 PHP isset 测试

javascript - Vuejs 三元运算符/条件在 v-bind-style 中不起作用

c - 如何计算周期?

c - 以“可能”在尽可能多的系统上工作的方式读取低指针位

macros - 当协议(protocol)调用表单包含 <!宏(多方法 '-item-to-ssa' 无法在 :protocol-invoke) 上调度