You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者江赫霆

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:57:27