使用C 14/17时,哪些宏观用途仍然是不可避免的?
作者:互联网
在C语言中,许多开发人员(甚至可能是我们大多数人)都不喜欢宏,并试图避免使用它们来支持正确的语言结构.并且 – 似乎语言也倾向于鼓励这一点.渐渐地,我们已经能够在很多情况下摆脱宏观使用:
>类型多态性 – >模板编程
>条件编译 – >模板参数,SFINAE等的编译时评估
> #include guards – >对于某些编译器来说,#pragma曾经一次,虽然我猜你不能相信它;很快我们就应该有C 17模块并导入而不是包含.
我的问题是 – 还剩下什么?什么样的宏观使用是完全不可避免的,或者是非常痛苦的避免?我能想到的主要例子是:
>使用文件名,行号和函数/方法名称:
#define LOG(whatever, ...) log(__FUNCTION__, __FILE__, __LINE__, whatever, VA_ARGS)
>用于将代码块作为“参数”的语法糖,例如
AT_SCOPE_EXIT { release_resource(); }
在Andrei Alexandrescu的ScopeGuard(或查看video).虽然我想我们真的不需要使用简洁的宏使用伪语法.
>也许某些种类的Boost伏都教?
>向后兼容性?
我错过了宏的其他重要用途? (请不要超级特殊的角落情况.)
解决方法:
禁用代码部分而不必担心嵌套注释.
#if 0
...
#endif
各种条件编译.
// C/C++ dual-purpose headers
#if __cplusplus
extern "C" {
#endif
// checking third-party library versions for API compatibility
#if BOOST_VERSION >= 104600
...
#endif
// checking platforms for API compatibility
#if _WIN32
...
#endif
标签:c,macros,c17,idioms 来源: https://codeday.me/bug/20190724/1526446.html