C++能否通过#define宏将普通字面量定义为<<、>>等运算符?
报错核心原因
编译不通过是两个问题叠出来的:
- 宏名踩了保留字:C++标准里
and是原生关键字,是逻辑与&&的官方别名,本身就不允许被重定义成宏,这是编译器直接报错的主要原因。 - 替换后语法不对:就算宏名合法,你写的
input value1 with value2替换完是cin value1 >> value2,cin和第一个变量之间缺了>>运算符,语法本身就不成立,一样编不过。
可用的实现方案
竞赛场景没必要搞复杂的运算符重载,换合法的宏名、调整下书写顺序就行,代码可以直接跑,完全能达到简化输入输出的效果:
#include <iostream> using namespace std; // 避开保留字,用首字母大写的And/With当宏名,喜欢小写也可以用_and、_with这类带下划线前缀的名字 #define And << #define With >> #define print cout #define input cin int main() { long long value1, value2; // 流对象和第一个变量/输出值之间必须带运算符宏,替换完就是标准的cin >> a >> b、cout << a << b写法 input With value1 With value2; print And value1 And ' ' And value2 And '\n'; return 0; }
如果追求打字更快,也可以换更短的宏名,比如把>>定义成r,<<定义成w,打起来比按两次shift输尖括号效率高很多,也是很多竞赛选手常用的写法。
要是非要用小写and当宏名,可以在包含iostream之后加一句#undef and再重定义,但这属于标准未定义行为,不同编译器支持度不一样,OJ提交大概率出兼容问题,不建议用。
注意:旧版MSVC可能默认没把
and当关键字,允许直接重定义,但主流OJ用的GCC、Clang都会直接报错,不要依赖这个编译器特性。
内容的提问来源于stack exchange,提问作者江赫霆
相关产品推荐
相关产品推荐

