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.h
或 buffer.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++
来解决它
当我尝试构建一个包含 .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.h
或 buffer.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++
来解决它