代码之家  ›  专栏  ›  技术社区  ›  Chan Kim

在C或C++中,如何防止头文件中的前一个定义影响另一个包含的头文件?

  •  0
  • Chan Kim  · 技术社区  · 5 年前

    我想除了更改函数/宏名称之外,可能没有办法避免这种情况,但我在这里问一下,以防万一。

    我遇到了一个奇怪的情况。

    driverA.cc 在程序A中,如下所示:

    #include "includeA.h"
    
    #ifdef USED_IN_QEMU
    #include "includeB.h"
    #endif
    
    // some code...
    

    includeA.h 有这样一个宏:

    #define set_pc(x) \
      do { p->check_pc_alignment(x); \
           npc = sext_xlen(x); \
         } while(0)
    

    但是 includeB.h 有以下代码:

    static inline void cpu_set_pc(CPUState *cpu, vaddr addr)
    {
        CPUClass *cc = CPU_GET_CLASS(cpu);
                     
        cc->set_pc(cpu, addr);
    } 
    

    set_pc() 应该只接受一个论点 ,但是 设置\u pc() 接受两个参数。我知道它只是一个相同的名字,但是不同的函数或宏,但是include文件之间产生了冲突。编译器不知道它们属于不同的世界。

    如何避免这种编译错误?

    2 回复  |  直到 5 年前
        1
  •  5
  •   dbush    5 年前

    切换的顺序包括:

    #ifdef USED_IN_QEMU
    #include "includeB.h"
    #endif
    
    #include "includeA.h"
    

    这样includeA.h中的宏就不会影响includeB.h中的任何内容。

        2
  •  -1
  •   Warkanlock    5 年前

    #ifndef

    #ifndef
    #include "yourlibrary"
    #endif
    

    请考虑宏是C++中控制包含语句的一个非常有用的工具。

    有关的详细信息 如果未定义 条件编译 :

    检查给定的令牌是否已在文件或包含的文件中定义;如果不存在,则包含它与结束语句#else之间的代码,如果不存在#else,则包含#endif语句#ifndef通常用于使头文件幂等,方法是在包含文件后定义一个标记,并检查该标记是否未设置在该文件的顶部。