Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从其他文件C+;控制文件中的编译器指令+;_C++_Compiler Directives - Fatal编程技术网

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。标题保护的错误名称选择。以下划线开头,后跟大写字母的任何名称(无论是预处理器宏、变量、类或函数名还是其他名称)都是为实现保留的(就像任何包含两个连续下划线的名称一样,在任何位置),不应在用户代码中使用。