C++ 从.h和.cpp进行条件编译
我正在试图制作一个库文件。.cpp文件有一些条件编译行。有关代码,请访问: HMC58X3.h HMC58X3.cpp HMC58X3_原始pde 基本上,在Arduino草图文件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不像
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发现了我的问题。。我想我花了太多时间在高级语言上。。无论如何,谢谢你。