2017-09-27 110 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

相关问题