【问题标题】:Cannot use header enum无法使用标头枚举
【发布时间】:2013-06-03 14:30:02
【问题描述】:

我想做以下事情:

parser.h

#ifndef WS_PARSER_H
#define WS_PARSER_H
#include <stdin.h>
#include <stdbool.h>

typedef enum {
    FIN = 0x80;
    RSV1 = 0x40
    /* ... */
} ws_flags;

#endif

parser.c

#ifndef WS_PARSER
#define WS_PARSER
#include "parser.h"

ws_read_fin_flag(unsigned char * chunk) {
    return (bool) chunk[0] & WS_FLAGS.FIN;
}

#endif

不幸的是,我知道 FIN 是一个未声明的标识符。

我做错了什么?

更新:

全局枚举的约定是什么?

typedef enum {} WS_FLAGS;

【问题讨论】:

  • 很难看到错字。您应该使用像样的 IDE,以便在您键入时突出显示这些拼写错误。尝试日食。
  • 这意味着您可以在没有枚举限定符的情况下引用WS_FLAGS,例如定义WS_FLAGS flag=FIN;类型的变量,不要从答案中纠正您的问题
  • @GrijeshChauhan 这符合约定吗?还是我应该使用宏图

标签: c header enums constants


【解决方案1】:
#ifndef WS_PARSER_H
#define WS_PARSER_H
#include <stdin.h>
#include <stdbool.h>

typedef enum {
    FIN = 0x80,
    RSV1 = 0x40,
    /* ... */
} ws_flags;

#endif

这是一个,,而不是;

【讨论】:

  • FOR OP:不要在RSV1 = 0x40, 之后添加,,如果是最后一个。
  • @GrijeshChauhan:为什么不呢?这是合法的 C 语法。它简化了事情。
  • @GrijeshChauhan:是的,我确定。 ISO/IEC 9899:1999, 6.7.2.2 是这样说的。参见例如open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
  • @undur_gongor 哇……太好了!我也checked here感谢您提供的信息,并特别感谢这本书:)
【解决方案2】:

几点:

1) 你的枚举有 ;在它的中间,请删除所有这些。

typedef enum {
    FIN = 0x80,
    RSV1 = 0x40
    /* ... */
} ws_flags;

2) 不需要

#ifndef WS_PARSER
#define WS_PARSER
#endif

在 c 文件的顶部,那些是防止包含相同定义的保护,您通常不包含 c 文件或 cpp 文件,不需要在源文件中。

3) 代替

#ifndef WS_PARSER_H
#define WS_PARSER_H

您可以在文件顶部使用

#pragma once

它做同样的事情并得到当今大多数编译器的支持

【讨论】:

    【解决方案3】:
    #ifndef WS_PARSER
    #define WS_PARSER
    

    把它放在 .c 文件中会导致 .h 的内容被忽略,因为 .h 文件具有相同的包含保护。

    您应该只在 .h 文件中放置包含保护。

    【讨论】:

    • 仅供参考...我不知道是否对原始问题进行了编辑,但他的标题中实际上有 WS_PARSER_H,这与 WS_PARSER 不同。所以,.h 不会被忽略(虽然没有必要将#ifndef WS_PARSER 放在.c 文件中)。
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多