【问题标题】:How to Access enum from header file into main program in C?如何将枚举从头文件访问到C中的主程序?
【发布时间】:2015-07-31 14:01:40
【问题描述】:

我在 C 中创建了一个包含枚举“应用程序”的 .h 文件。这个枚举值需要在 main.c 程序中访问。我的代码如下所示:

 state.h file

#ifndef State_H_
#define State_H_

#define enum app {A,D,H};

#endif

我的主要程序是:

 #include <stdlib.h>
 #include <stdio.h>
 #include "State.h"

char letters[] ={'AAAA'};
if( letters[0] ==State.app[0])
{
   printf("the first letter is matching");
}

但是在 if 语句中 State.app[0] 给出了一个错误

错误:无法解析状态, 应用无法解析。

请有人建议我可以从头文件中访问枚举值的方法。请注意 int main 和 return 是程序的一部分。我只是没有将它们包括在这里。 提前感谢您的帮助。

【问题讨论】:

  • 您是否(不)收到任何警告?
  • @SouravGhosh:不。我只是得到这个错误。没有警告。
  • 不要对全局对象使用单个字符的名称!
  • 仔细看'AAAA'....
  • And.. #define enum .... 是一个非常奇怪的结构。好吧,@Olaf 说的。

标签: c enums header


【解决方案1】:

State 没有定义“命名空间”(就像在 C# 中一样),因此您无法访问 type(使用枚举您正在定义 type)通过将标题名称用作前缀。

你应该像这样定义枚举:

enum app = { AA, BB, CC };

如果需要,您可以将“状态”定义为局部变量。

enum app State;

然后赋值:

State = AA;

不过,我仍然不清楚你要做什么。

【讨论】:

    【解决方案2】:

    很多很多问题。

    首先,

    #define enum app {A,D,H};
    

    不创建枚举类型;相反,它会创建一个名为enum,只要它出现在您的代码中,它就会被替换为文本app {A,D,H};。如果你想创建一个枚举类型,只需写

    enum app {A, D, H};
    

    其次,枚举类型不像数组。您不能使用数组下标语法(例如app[0])访问枚举值。您使用 枚举常量 ADH。此外,头文件不创建命名空间;你不要使用State 作为任何东西的前缀。

    最后,枚举常量A 与字符常量'A' 不是一回事,它不会自动具有相同的值。您必须使用所需的值显式初始化枚举常量,如下所示:

    enum app { A = 'A', D = 'D', H = 'H' };
    

    因此,将所有内容放在一起,您的代码将如下所示:

    /**
     * State.h
     */
    #ifndef State_H_
    #define State_H_
    
    enum app { A = 'A', D = 'D', H = 'H' };
    
    #endif
    
    /**
     * main.c
     */
    #include <stdlib.h>
    #include <stdio.h>
    #include "State.h"
    
    int main( void )
    {
      char letters[] ={'A', 'A', 'A', 'A'}; // thanks NiBZ.
      if( letters[0] == A)      // no qualifier, just the bare enum constant
      {
         printf("the first letter is matching");
      }
      return 0;
    }
    

    编辑

    正如 NiBZ 指出的那样,声明存在问题

    char letters[] ={'AAAA'}; 
    

    如果你想要一个简单的字符数组,那么初始化器需要看起来像

    char letters[] = {'A', 'A', 'A', 'A' };
    

    如果您希望 letters 成为 字符串(由 0 值字节终止的字符序列),则初始化程序需要看起来像

    char letters[] = {'A', 'A', 'A', 'A', 0 };
    

    char letters[] = "AAAA";
    

    结束编辑

    说了这么多,这段代码感觉很混乱。如果枚举常量A 具有特殊含义,而不仅仅是字符常量'A' 的值,那么您应该为枚举常量使用更有意义的名称。例如,如果'A' 表示记录的开头或使用类似RECORD_BEGIN 的名称而不是A

    if ( letters[0] == RECORD_BEGIN )
    

    否则,只使用裸字符常量:

    if ( letters[0] == 'A' )
    

    【讨论】:

    • 你保留了char letters[] = {'AAAA'};。使用char letters[] = "AAAA"; 之类的东西会......更好;)
    • @NiBZ:笨蛋。我会解决的。
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2016-02-10
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多