C++宏定义展开结果不符合预期,为何输出“Aa”而非目标结果?
问题分析:宏展开与C++特性导致输出不符合预期
先看你的代码:
#include <iostream> using namespace std; #define _VA_ARG_LIST2(t, a) t a #define _VA_ARG_LIST4(t, a, b, c) \ _VA_ARG_LIST2(t, a), _VA_ARG_LIST2(b, c) int main() { cout << _VA_ARG_LIST4("A", "a", "B", "b"); // 输出 Aa return 0; }
你期望输出 "A a","B b",但实际只得到 "Aa",核心原因有三点:
宏是纯文本替换:
_VA_ARG_LIST4("A", "a", "B", "b")展开后是:"A" "a", "B" "b"宏只会做字面量拼接,不会自动添加空格、引号或调整格式。
C++会合并相邻字符串:编译器会自动将挨在一起的字符串字面量合并成一个,所以
"A" "a"直接变成"Aa","B" "b"变成"Bb",展开后的cout语句实际等价于:cout << "Aa", "Bb";逗号运算符的行为:这里的逗号是C++的逗号运算符,优先级比
<<低,所以先执行cout << "Aa"(这就是你看到的输出),然后计算右侧的"Bb",但这个结果不会被输出——逗号运算符仅返回右侧的值,这里没有代码处理这个返回值,所以最终只有"Aa"被打印。
如果要得到你想要的输出,需要修改宏来构造正确的格式,示例如下:
#include <iostream> using namespace std; // 构造单个 "t a" 格式的字符串 #define _MAKE_PAIR(t, a) "\"" t " " a "\"" // 拼接两个pair,中间加逗号空格 #define _VA_ARG_LIST4(t, a, b, c) _MAKE_PAIR(t, a), ", ", _MAKE_PAIR(b, c) int main() { cout << _VA_ARG_LIST4("A", "a", "B", "b"); // 输出 "A a", "B b" return 0; }
内容的提问来源于stack exchange,提问作者aibinmr
相关产品推荐
相关产品推荐

