2013-06-03 96 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')。 –