C++ 的多行宏定义方式

作者: , 共 620 字 , 共阅读 0

C++的多行宏有标准定义方式,boostfolly库都采用了这种方式:

#define MACRO(X)        \
    do {                \
        X = 1;          \
        std::cout << X; \
    } while (0) 

其中\用来换行,其它最关键之处为实际运行语句用do {} while (0)包起来。这是为什么呢?

如果直接定义如下:

#define MACRO1(X)        \
    X = 1;              \
    std::cout << X; 

那么下面语句展开的结果可能不符预期:

int x = 0;
if (x == 0) 
    MACRO1(X);

直接用{}包起来也不行:

#define MACRO2(X)        \
    {                   \
        X = 1;          \
        std::cout << X; \
    }

它在下面语句展开会造成语法错误:

int x = 0;
if (x == 0) 
    MACRO2(X);
else 
    x = 2;

在标准定义中引入了多余的语句,但在现代编译器会自动优化掉这些语句,不会增加指令。

Q. E. D.

类似文章:
编程 » C++, gcc
follyLikely.h文件提供了 LIKELY 和 UNLIKELY 宏,提示编译器在分支预测时选择分支。其实现很简单
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » folly, C++, 数据容器
由 Facebook 开发和维护的 C++库 Folly 提供folly::sorted_vector_setfolly::sorted_vector_map,是std::mapstd::set在小数据集上的优化版。代码见: https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
相似度: 0.081
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0
编程 » C++, C++标准库
std::tuple的原理并不复杂,但有些细节非常有意思。其中有一个是至少在gnu C++ std的实现中,std::tuple是倒序存储的:
由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现folly::MicroSpinLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h
编程 » Matlab
在写 Matlab 程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。
时间管理中有重要的一条,保持你的收件箱整洁、干净。Gmail 一个重要的创新就是 Archive (存档),选中邮件后点下「archive」按钮或者按一下快捷键 y ,邮件就被移出收件箱,但又跟删除邮件不一样,这些邮件还可以继续被搜索。这里讲最近写的如何在 Outlook 里实现这个功能。
看到网上有片段,提到没有必要自己实现自旋锁,因为标准库的 std::mutex 和现在的自旋锁的实现没有两样。比较好奇,翻了一些资料,试图找到答案。
书评影评 » 新宋, 小说
从 2004 年开始连载,历时 15 年,《新宋》终于完本。实体书已出版,微信读书上也可以免费看(用免费的无限卡)。
招聘部门:中信证券股权衍生品业务线