cppcoreguidelines-macro-usage¶
查找被认为存在问题的宏使用方式,因为更好的语言结构可以完成此任务。
C++ 核心准则中的相关部分是 ES.31 和 ES.32。
示例
#define C 0
#define F1(x, y) ((a) > (b) ? (a) : (b))
#define F2(...) (__VA_ARGS__)
#define F3(x, y) x##y
#define COMMA ,
#define NORETURN [[noreturn]]
#define DEPRECATED attribute((deprecated))
#if LIB_EXPORTS
#define DLLEXPORTS __declspec(dllexport)
#else
#define DLLEXPORTS __declspec(dllimport)
#endif
将产生以下警告
4 warnings generated.
test.cpp:1:9: warning: macro 'C' used to declare a constant; consider using a 'constexpr' constant [cppcoreguidelines-macro-usage]
#define C 0
^
test.cpp:2:9: warning: function-like macro 'F1' used; consider a 'constexpr' template function [cppcoreguidelines-macro-usage]
#define F1(x, y) ((a) > (b) ? (a) : (b))
^
test.cpp:3:9: warning: variadic macro 'F2' used; consider using a 'constexpr' variadic template function [cppcoreguidelines-macro-usage]
#define F2(...) (__VA_ARGS__)
^
选项¶
- AllowedRegexp¶
用于过滤允许宏的正则表达式。例如 DEBUG*|LIBTORRENT*|TORRENT*|UNI* 可用于过滤 libtorrent。默认值为 ^DEBUG_*。
- CheckCapsOnly¶
布尔标志,用于警告所有宏,除了那些具有 CAPS_ONLY 名称的宏。此选项旨在简化此检查在较旧代码库中的引入。默认值为 false。
- IgnoreCommandLineMacros¶
布尔标志,用于切换是否忽略命令行定义的宏。默认值为 true。