向 #define int long long 说不
TL;DR
#define int long long
是一种未定义行为,尽量不要在代码中使用它。
前言
在算法竞赛社区中,经常能看见有人在代码中使用 #define int long long 来偷懒。我是一直极力反对这种做法的,因为这种做法会导致代码的可读性大大降低,并带来一些难以预料的问题。
C++ 标准
在 ISO/IEC 14882:2014(E) 的 17.6.4.3.1 Macro names 一节中,有这样一段描述:
翻译并整理一下,就是:
翻译单元不可
#define
或#undef
词法上等同于下列部分的名称:
C++ 中的关键字(表 4、表 5,在 2.12 节 Keywords
[lex.key]
中给出);有特殊含义的标识符(表 3,在 2.11 节 Identifiers
[lex.name]
中给出);任何标准属性记号(attribute-token,在 7.6 节 Attributes
[dcl.attr]
中给出)。
也就是说,标准中 并不允许 #define int
这种操作。
编译器实现
GCC
在 GCC 的 C Preprocessor 文档中 给出了下面的说明:
You may define any valid identifier as a macro, even if it is a C keyword.
也就是说,GCC 并没有严格按照标准来实现预处理器,而是稍微放宽了一些限制以允许通过这种方式来使得代码更加灵活,便于增强代码的向下兼容性。
Clang
相关文档中并未提及是否允许 define 关键字,但源代码中未见相关限制。
MSVC
#define
指令 相关文档中并未提及。
后记
使用适当的数据类型来存储数据,有利于代码的可读性和稳定性,便于编写和调试。同时,正确设置变量类型也能提高程序的运行速度和效率。因此,我们应该做好正确的数据类型定义,而不是在编写代码时滥用 #define int long long
。