2017-09-27 108 views
0

當我嘗試構建包含.c和.h文件的C項目時,Visual Studio給了我奇怪的錯誤,就像這是我的頭文件的代碼(它應該是完美的精):Visual Studio似乎將頭文件編譯爲.c文件

#ifndef _CLIENT_SOCKET_H_ 
#define _CLIENT_SOCKET_H_ 

#include "common.h" 
#include "buffer.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef void* wsocket; 

int socket_create(wsocket* sock, int port, const char* addr, struct sockaddr_in *s_addr); //This is line 28 

int socket_connect(wsocket sock, struct sockaddr_in s_addr); 

bool socket_recv_buffer(wsocket, buffer_t*); 

bool socket_send_buffer(wsocket, buffer_t); 

int socket_destroy(wsocket* sock); 

#ifdef __cplusplus 
} 
#endif 

#endif /* _CLIENT_SOCKET_H_ */ 

我得到這樣的錯誤:

syntax error: missing '{' before '.'  
在第28行或

syntax error: '.' 

兩個

它似乎試圖編譯標題,就好像它是一個.c文件,因爲它需要一個函數體等。你有什麼想法會發生什麼?

+0

P1緩解不張貼圖片。剪切並粘貼錯誤消息 –

+0

'.c'文件和'.h'文件是相同的語言;函數可以在兩者中定義或聲明(有或沒有實體)。你有一個實際的語法錯誤。 – SLaks

+0

那麼這些語法錯誤是什麼呢?我爲我的標題發佈了代碼。 –

回答

1

如果第28行確實是您評論的那一行,則編譯錯誤非常令人驚訝:此行中沒有.

一個可能的解釋是,該行上至少有一個標識符被定義爲common.hbuffer.h作爲宏並擴展爲結構成員訪問。

例如:

#define socket_create socket.create 

檢查這些頭文件的內容。

編輯:問題的確是一個系統頭文件的亂真宏定義:

https://msdn.microsoft.com/en-us/library/windows/hardware/ff556972(v=vs.85).aspx

s_addr在作爲#define s_addr S_un.S_addr

使用s_addr作爲參數的名稱來定義(或一個本地變量)導致編譯器的一個神祕的錯誤消息,因爲宏擴展...

+0

我實際上只是修復了它,問題(像往常一樣)與錯誤消息無關:看起來s_addr是關鍵字,而我無法像這樣調用我的變量。我應該回答並接受嗎? –

+0

's_addr'不是一個關鍵字......它被定義爲頭文件中的宏或Visual Studio的一個 – chqrlie

+0

我用解釋更新了答案。 's_addr'實際上不能用作參數名稱,並且錯誤信息是神祕的。 – chqrlie

相關問題