C++ 从其他文件C+;控制文件中的编译器指令+;
考虑下面的头文件C++ 从其他文件C+;控制文件中的编译器指令+;,c++,compiler-directives,C++,Compiler Directives,考虑下面的头文件 // filename : packet_types.h #ifndef _PACKET_TYPES_ #define _PACKET_TYPES_ struct Packet { enum Type { typ_ONE, typ_TWO, typ_THREE, }; static const char * STRINGS[]
// filename : packet_types.h
#ifndef _PACKET_TYPES_
#define _PACKET_TYPES_
struct Packet {
enum Type {
typ_ONE,
typ_TWO,
typ_THREE,
};
static const char * STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * getText( int enum ) {
return STRINGS[enum];
}
};
#endif
由于Arduino内存有限,我不想在包含这个文件packet_types.h时包含这部分代码
static const char * STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * getText( int enum ) {
return STRINGS[enum];
}
但是对于我的GUI应用程序,我需要完整的文件。我想对Arduino和GUI使用相同的文件,但如何添加编译器指令#define、#ifdef、#ifndef。。。若要执行此操作,请从其他文件(main.cpp)中包含此文件。谢谢。< P>虽然可以使用一些预处理器杂耍,但是正确的解决方法是简单地使用C++来代替它。仅在头文件中声明这些类成员和方法:
static const char * STRINGS[];
const char * getText( int enum );
然后在其中一个源文件中定义它们:
const char * Packet::STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * Packet::getText( int enum ) {
return STRINGS[enum];
}
通过前面提到的预处理器处理,它最终实现的是相同的逻辑结果,但以一种更加混乱和迂回的方式。如果您能指出如何仅使用编译器指令就可以了。例如,只需将必要的位放入
#ifdef
中,并在其#include
之前仅在一个源文件中定义符号。你已经知道如何使用#ifndef
,所以你已经知道你需要做的一切。谢谢@sam,包括#在包含之前定义文本#包含“packet#u types.h”完成了这项工作,我在#ifdef TEXT中包含了不需要的代码#endif。标题保护的错误名称选择。以下划线开头,后跟大写字母的任何名称(无论是预处理器宏、变量、类或函数名还是其他名称)都是为实现保留的(就像任何包含两个连续下划线的名称一样,在任何位置),不应在用户代码中使用。