C++ 从.h和.cpp进行条件编译

C++ 从.h和.cpp进行条件编译,c++,c,arduino,C++,C,Arduino,我正在试图制作一个库文件。.cpp文件有一些条件编译行。有关代码,请访问: HMC58X3.h HMC58X3.cpp HMC58X3_原始pde 基本上,在Arduino草图文件HMC58X3_raw.pde中,我定义了ISHMC55843,在HMC58X3.cpp和HMC58X3.h中,我确实有不同的代码需要编译,具体取决于该标志是否已启用 条件编译似乎适用于HMC58X3.h,而不适用于HMC58X3.cpp。看起来好像ISHMC5843一直没有定义。它是如何工作的?一个#define不像

我正在试图制作一个库文件。.cpp文件有一些条件编译行。有关代码,请访问:

HMC58X3.h

HMC58X3.cpp

HMC58X3_原始pde

基本上,在Arduino草图文件
HMC58X3_raw.pde
中,我定义了ISHMC55843,在
HMC58X3.cpp
HMC58X3.h
中,我确实有不同的代码需要编译,具体取决于该标志是否已启用

条件编译似乎适用于
HMC58X3.h
,而不适用于
HMC58X3.cpp
。看起来好像ISHMC5843一直没有定义。它是如何工作的?

一个
#define
不像一个全局变量。它是一个预处理器宏,只适用于该编译单元的剩余文本。有几种方法可以满足您的需求:

  • 使用
    #define ISHMC5843
    创建一个
    config.h
    ,并确保在任何地方都包含它(以及在任何其他引用它的地方包含它之前)
  • Makefile
    (在Arduino中可能无法访问)中,确保
    -DISHMC5843
    出现在每一个编译行上,通常是将其包含在
    CFLAGS
    中。(如何确保
    CFLAGS
    是编译规则的一部分的细节远远超出了这个问题的范围)
  • #define
    与全局变量不同。它是一个预处理器宏,只适用于该编译单元的剩余文本。有几种方法可以满足您的需求:

  • 使用
    #define ISHMC5843
    创建一个
    config.h
    ,并确保在任何地方都包含它(以及在任何其他引用它的地方包含它之前)
  • Makefile
    (在Arduino中可能无法访问)中,确保
    -DISHMC5843
    出现在每一个编译行上,通常是将其包含在
    CFLAGS
    中。(如何确保
    CFLAGS
    是编译规则的一部分的细节远远超出了这个问题的范围)

  • 编译HMC58X3.cpp时,编译器未在HMC58X3_raw.pde中看到宏定义。在我看来,最好使用全局布尔常量变量来实现这里要做的事情。

    编译HMC58X3.cpp时,编译器没有看到HMC58X3_raw.pde中的宏定义。在我看来,最好使用一个全局布尔常量变量来实现这里的目标。

    我看不出在HMC58X3.h或HMC58X3.cpp中如何定义
    ISHMC558431

    预处理文件时,定义必须对预处理器可见。这通常是通过在需要查看宏的所有文件中包含
    #define
    的公共文件来实现的,或者通过在编译器命令行上定义宏来实现的,例如
    -DISHMC58431
    (取决于编译器)


    这当然需要预处理器处理.pde文件,因为它有
    #include
    语句,所以我假设它是。

    我看不出在HMC58X3.h或HMC58X3.cpp中如何定义
    ISHMC558431

    预处理文件时,定义必须对预处理器可见。这通常是通过在需要查看宏的所有文件中包含
    #define
    的公共文件来实现的,或者通过在编译器命令行上定义宏来实现的,例如
    -DISHMC58431
    (取决于编译器)


    这当然需要预处理器处理.pde文件,因为它有
    #include
    语句,所以我假设它是。

    没有错误,它就是不工作。。在.cpp文件中,它总是编译#ifdef ISHMC5843的#else部分,而它在.h条件编译中工作正常。当您单独编译HMC58X3.o时,会发生这种情况吗?你是如何编译的?@Beta-Ben发现了我的问题。。我想我花了太多时间在高级语言上。。无论如何,谢谢。没有错误,只是不起作用。。在.cpp文件中,它总是编译#ifdef ISHMC5843的#else部分,而它在.h条件编译中工作正常。当您单独编译HMC58X3.o时,会发生这种情况吗?你是如何编译的?@Beta-Ben发现了我的问题。。我想我花了太多时间在高级语言上。。无论如何,谢谢你。