从其他文件 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++ 控制文件中的编译器指令的主要内容,如果未能解决你的问题,请参考以下文章

变量,循环控制语句

C零基础课程-01-从C程序到可执行文件的过程

从其他控制器调用指令控制器中的方法

图解cpu,内存,硬盘,指令的关系

如何将文件中的其他参数从 Angular 传递给 ASP.NET Core 控制器?

预编译(c++常问问题十二)