C++宏定义与默认行为
背景
使用宏对代码进行条件适配,不同风格的写法会如何影响代码行为?
探究
使用gcc对常用的#ifdef
和#if
进行试验。测试代码如下:
#include <iostream>
int main()
{
#ifdef MARCO
std::cout << "#ifdef activated, MARCO = " << MARCO << std::endl;
#else
std::cout << "#else of #ifdef activated." << std::endl;
#endif
#if MARCO
std::cout << "#if activated, MARCO = " << MARCO << std::endl;
#else
std::cout << "#else of #if activated." << std::endl;
#endif
return 0;
}
测试结果
$ g++ marco.cpp
$ ./a.out
#else of #ifdef activated.
#else of #if activated.
$ g++ marco.cpp -DMARCO
$ ./a.out
#ifdef activated, MARCO = 1
#if activated, MARCO = 1
$ g++ marco.cpp -DMARCO=0
$ ./a.out
#ifdef activated, MARCO = 0
#else of #if activated.
$ g++ marco.cpp -DMARCO=1
$ ./a.out
#ifdef activated, MARCO = 1
#if activated, MARCO = 1
结论
结果-DMARCO
和-DMARCO=1
一致,推断默认值为1
声明-DMARCO=0
时#if
根据值判断无法激活
此时#ifdef
根据是否声明判断依然会激活,与赋值无关