Visual Studio 似乎将 headers 编译为 .c 文件

Visual Studio seems to compile headers as .c files

当我尝试构建一个包含 .c 和 .h 文件的 C 项目时,Visual Studio 给了我奇怪的错误,就像这是我的 header 的代码(应该完全没问题):

#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 '.'    

syntax error: '.'   

都在第 28 行。

它似乎正在尝试将 header 编译为 .c 文件,因为它需要一个 body 作为函数等。你知道会发生什么吗?

如果确实是你评论的第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 作为参数(或局部变量)的名称会导致编译器出现神秘的错误消息,因为宏展开...

我知道这是一个老问题,但我 运行 今天也在这个问题上。对我来说,问题是文件的项目类型被设置为源文件。我设法通过转到文件的属性并将项目类型设置为 C/C++

来解决它