不应使用宏定义常量
3.2.8 ID_macro_const
宏用于文本处理,不受作用域等语言规则限制,不应使用宏实现常量等语言层面的概念。
示例:
namespace U {
#define PI 3.14F // Non-compliant
}
namespace V {
#define PI 3.14159L // Non-compliant
}
namespace W {
void fun(double PI); // Disturbed
}
例中宏 PI 不受命名空间的限制,第二个宏定义会覆盖第一个宏定义,而且会干扰其他作用域中相同的名称。
应改为:
namespace U {
const float PI = 3.14F; // Compliant
}
namespace V {
const long double PI = 3.14159L; // Compliant
}
为了避免混乱,建议宏只作为 #if、#elif 等指令的条件,不参与具体的功能实现。