代码之家  ›  专栏  ›  技术社区  ›  Eärendil Baggins

Visual Studio似乎将标题编译为。c文件

  •  0
  • Eärendil Baggins  · 技术社区  · 7 年前

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

    它似乎在试图编译头,就好像它是一个。c文件,因为它需要函数等的主体。你知道会发生什么事吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   chqrlie    7 年前

    如果第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\u地址 由于宏扩展,参数(或局部变量)的名称会导致来自编译器的隐藏错误消息。。。

        2
  •  1
  •   laurisvr    4 年前

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