C++宏定义与默认行为

Azure's Blog / 2023-08-03 / 原文

背景

使用宏对代码进行条件适配,不同风格的写法会如何影响代码行为?

探究

使用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根据是否声明判断依然会激活,与赋值无关