【问题标题】:using ifdef and ifndef directives to include header files使用 ifdef 和 ifndef 指令包含头文件
【发布时间】:2022-01-20 09:24:16
【问题描述】:

请原谅我的基本问题和糟糕的编程知识。

我有一个需要在我的许多项目中使用的实现。但是不同项目包含的头文件不同。

假设我有用于 projecta.c 和 projectb.c 的 spi.h 头文件。但是 projectb.c 中不需要特定的包含(definitions.h),那么我如何使这个包含项目特定?

我已经看到这是通过#ifdef 和#ifndef 和指令完成的。但是有人可以帮我理解它是如何完成的。

谢谢

【问题讨论】:

  • 您可能也可以只使用#pragma 一次。要使包含文件项目特定:将它们放在源文件文件夹中,对于“共享”头文件将它们放在共享文件夹中,对于 sdk 头文件,请创建一个 sdk 文件夹。
  • 请不要描述您的代码,而是显示一个示例。目前还不清楚definitions.h 究竟会包含在哪里?在projecta.c 或projectb.c?在spi.h?请edit您的问题并显示minimal reproducible example。

标签: c++ c include preprocessor-directive using-directives


【解决方案1】:

假设我有用于 projecta.c 和 projectb.c 的 spi.h 头文件。但是 projectb.c 中不需要特定的包含(definitions.h),那么我如何使这个包含项目特定?

像这样:

// projecta.c
#include "spi.h"
#include "definitions.h"

// projectb.c
#include "spi.h"

不需要ifdef 指令。

【讨论】:

    【解决方案2】:

    您可以根据#ifdef 像这样包含某个标头:

    #ifdef INCL_DEFINITIONS
    #   include "definitions.h"
    #endif
    

    在你需要definitions.h的项目中,你必须将-DINCL_DEFINITONS添加到编译器参数中

    【讨论】:

    • 在此之前我们必须定义 INCL_DEFINITIONS: 比如,#define INCL_DEFINITIONS
    • 在 "-DINCL_DEFINITONS" 下完成
    【解决方案3】:

    我已经看到这是通过 #ifdef 和 #ifndef 以及指令完成的。

    可以通过#ifdef 和#ifndef 指令或#if 指令来完成。

    其中的关键部分是您需要一些方法来根据正在构建的项目定义预处理器宏。这样做的常见方法是:

    • 每个项目都有自己的构建设置。
    • 这些构建设置包括传递给编译器的选项。
    • 编译器具有定义预处理器符号的选项。

    例如,使用 GCC 和 Clang,您可以使用 -D<i>symbol</i> 导致定义 <i>symbol<i></i></i>(没有替换标记;它已定义,但定义为空)或 -Dsymbol=replacement 导致它被定义用指定的replacement 定义。

    一旦有了这个,就可以选择如何使用它。一种选择是,如果应该包含一个特征,则定义一个符号,如果不包含,则定义一个符号。然后你会有如下指令:

    #if defined FeatureX
        #include "HeaderForFeatureX.h"
    #endif
    

    另一种选择是将符号定义为 1 如果应该包含该特征,则定义为 0 如果不包含。那么你会:

    #if FeatureX
            #include "HeaderForFeatureX.h"
    #endif
    

    从历史上看,有些人使用第一选择,有些人使用第二选择。因此,编写设置和代码来涵盖它们是很常见的。当使用编译器选项定义符号时,我们将同时定义它(满足第一种方法)并将其定义为 1(满足第二种方法),就像 -DFeatureX=1 一样。在测试它时,我们将使用#if defined FeatureX 进行测试,因为如果使用任一选项,则为真,而#if FeatureX 仅在FeatureX 定义为 1 时为真,而不仅仅是用空替换标记定义。

    (在#if 指令中,如果可能是预处理器宏名称的标记不是已定义的预处理器宏名称,则将其替换为0。因此,如果未定义FeatureX,则#if FeatureX变成#if 0。)

    第三种选择是根据所选特征定义一个符号以具有不同的值。例如,我们可以将ProductLevel 定义为 10、20 或 30,然后使用如下指令:

    #if 10 <= ProductLevel
        #include "Level10Features.h"
        #if 20 <= ProductLevel
            #include "Level20Features.h"
            #if 30 <= ProductLevel
                #include "Level30Features.h"
            #endif
        #endif
    #endif
    

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多