2013-06-03 58 views
0

我想这样做以下:不能使用头枚举

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是一个不宣标识符。

我做错了什么?

UPDATE:

什么是全球枚举的约定?

typedef enum {} WS_FLAGS; 
+1

很难看到错字。你应该使用体面的IDE,所以这些错别字会在你输入时突出显示。尝试日食。 –

+0

这意味着你可以引用没有枚举限定符的'WS_FLAGS',例如'WS_FLAGS flag = FIN;'类型的定义变量,请不要更正你的问题** –

+0

@GrijeshChauhan符合约定吗?或者我应该使用一个宏映射 – bodokaiser

回答

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

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

#endif 

这是一个,而不是;

+1

FOR OP:不要在'RSV1 = 0x40之后'添加',',如果是最后一个,也不要添加','。 –

+0

@GrijeshChauhan:为什么不呢?这是合法的C语法。它简化了一些事情。 –

+0

@undur_gongor你确定吗?我认为它的错误,但没有检查.. –

3

几点:

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

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

2)不需要一个

#ifndef WS_PARSER 
#define WS_PARSER 
#endif 

在C文件上,这些都是防止包括相同的定义,你通常不包括AC文件或CPP文件,不需要源文件中的那些。的

3),而不是

#ifndef WS_PARSER_H 
#define WS_PARSER_H 

在文件的顶部,你可以使用

#pragma once 

它做同样的事情,并为大多数标准者支持今天

0
#ifndef WS_PARSER 
#define WS_PARSER 

将它放在.c文件中会导致.h文件的内容被忽略,因为.h文件具有.h文件同样包括守卫。

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

+0

仅供参考......我不知道是否对原始问题进行了编辑,但他的标头中实际上有'WS_PARSER_H',这是不同于'WS_PARSER'。因此,.h不会被忽略(尽管不需要在.c文件中放入'#ifndef WS_PARSER')。 –