C++ 的多行宏定义方式

作者: , 共 615 字 , 共阅读 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.

类似文章:
follyLikely.h文件提供了 LIKELY 和 UNLIKELY 宏,提示编译器在分支预测时选择分支。其实现很简单
编程 » C++, 编译
一个典型的 GCC C++编译过程为:
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » C++
在实现C++中非阻塞式的用户输入中发现,在没有设置in.sync_with_stdio(false)时,in.rdbuf()里面总是空的。
编程 » 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
相似度: 0.080
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0http://boost.org/上可以查看最新版本号,将下面的 59 换成最新的即可)。
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
编程 » 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
时间管理中有重要的一条,保持你的收件箱整洁、干净。Gmail 一个重要的创新就是 Archive (存档),选中邮件后点下「archive」按钮或者按一下快捷键 y ,邮件就被移出收件箱,但又跟删除邮件不一样,这些邮件还可以继续被搜索。这里讲最近写的如何在 Outlook 里实现这个功能。
书评影评 » 新宋, 小说
从 2004 年开始连载,历时 15 年,《新宋》终于完本。实体书已出版,微信读书上也可以免费看(用免费的无限卡)。
招聘部门:中信证券股权衍生品业务线