繁体   English   中英

使用 ifdef 和 ifndef 指令包含 header 文件

[英]using ifdef and ifndef directives to include header files

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

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

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

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

谢谢

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

像这样:

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

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

不需要ifdef指令。

您可以包含某个 header 取决于这样的#ifdef

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

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

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

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

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

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

to cause 例如,对于 GCC 和 Clang,可以使用-D 来引起 =replacement to cause it to be defined with the indicated replacement . =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

代码结构称为Header guard ,你可以在这里看到 Header 保护的目的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM