2017-09-27 7 views
0

Lorsque j'essaie de générer un projet C contenant des fichiers .c et .h, Visual Studio me donne des erreurs étranges, comme ceci est le code de mon en-tête (qui devrait être parfaitement fin):Visual Studio semble compiler les en-têtes en tant que fichiers .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_ */ 

et je reçois des erreurs comme:

syntax error: missing '{' before '.'  

ou

syntax error: '.' 

à la fois à la ligne 28.

Il semble qu'il essaie de compiler l'en-tête comme s'il s'agissait d'un fichier .c, car il veut un corps pour la fonction et ainsi de suite. Avez-vous une idée de ce qui pourrait arriver?

+0

Pl facilité ne pas poster des photos. Couper et coller le message d'erreur –

+0

'.c' fichiers et' .h' fichiers sont la même langue; les fonctions peuvent être définies ou déclarées (avec ou sans corps) dans les deux. Vous avez une erreur de syntaxe réelle. – SLaks

+0

Qu'est-ce que toutes ces erreurs de syntaxe alors? J'ai posté du code pour mon en-tête. –

Répondre

1

Si la ligne 28 en effet celle que vous avez commentée, l'erreur de compilation est assez surprenante: il n'y a pas . sur cette ligne.

Une explication possible est qu'au moins l'un des identifiants sur cette ligne a été défini dans common.h ou buffer.h en tant que macro et étendu dans un accès de membre de structure.

Par exemple:

#define socket_create socket.create 

Vérifiez le contenu de ces fichiers d'en-tête.

EDIT: le problème était en effet une définition de macro parasite dans un fichier d'en-tête du système:

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

s_addr est défini dans comme #define s_addr S_un.S_addr

En utilisant s_addr comme le nom d'un argument (ou une variable locale) conduit à un message d'erreur cryptique du compilateur, à cause de la macro-expansion ...

+0

Je viens de le corriger, le problème avait (comme d'habitude) rien à voir avec le message d'erreur: il semblait que s_addr était un mot clé et je ne pouvait pas appeler ma variable comme ça. Dois-je répondre et l'accepter? –

+0

's_addr' n'est pas un mot-clé ... est-il défini comme une macro dans vos fichiers d'en-tête ou l'un des – chqrlie

+0

de Visual Studio J'ai mis à jour la réponse avec l'explication. 's_addr' ne peut en effet pas être utilisé comme nom d'argument, et le message d'erreur est cryptique. – chqrlie