其他分享
首页 > 其他分享> > 使用C 14/17时,哪些宏观用途仍然是不可避免的?

使用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