从其他文件 C++ 控制文件中的编译器指令
Posted
技术标签:
【中文标题】从其他文件 C++ 控制文件中的编译器指令【英文标题】:Controlling compiler directive in file from other file C++ 【发布时间】:2016-10-23 13:29:42 【问题描述】:考虑下面的头文件,
// 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 使用相同的文件,但是当我从其他文件(main.cpp)中包含这个文件时,如何添加编译器指令#define、#ifdef、#ifndef... 来完成这项工作。谢谢。
【问题讨论】:
那里的标头守卫名称选择错误。任何以下划线后跟一个大写字母开头的名称(无论是预处理器宏、变量、类或函数名称还是其他任何名称)都保留用于实现(任何包含两个连续下划线的名称,任何地方),并且不应在用户代码中使用。 【参考方案1】:虽然可以使用一些预处理器杂耍,但正确的解决方案是简单地使用 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,在包含#include "packet_types.h" 之前包含#define TEXT 完成了这项工作,我在#ifdef TEXT ... #endif 中包含了不需要的代码。以上是关于从其他文件 C++ 控制文件中的编译器指令的主要内容,如果未能解决你的问题,请参考以下文章