2 votes

Erreur de compilation C2275

J'ai programmé une simple application WinSock dans Visual Studio 2010. J'ai nommé le point d'entrée de mon application "main.c", puis je suis tombé sur cette erreur en déclarant un objet SOCKET :

error C2275: 'SOCKET' : illegal use of this type as an expression

Bizarrement, j'ai résolu ce problème en renommant le fichier de code de main.c a main.cpp

Par curiosité, je voudrais savoir ce que signifie cette erreur, et quelle différence il y a eu en changeant l'extension.

Merci d'avance.

EDIT

Voici le code correspondant :

#pragma comment(lib,"ws2_32")

#include <WinSock2.h>
#include <stdio.h>

int main()
{
// Startup the winsock
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;
wVersionRequested = MAKEWORD(2,2);
wsaerr = WSAStartup(wVersionRequested,&wsaData);
if(wsaerr != 0)
{
    printf("Winsock2 dll is not found!\n");
    WSACleanup();
    return 0;
}
else
{
    printf("Winsock2 dll is found!\n");
    printf("Current System Status: %s.\n",wsaData.szSystemStatus);
}

//Create a SOCKET object called socketobj.
SOCKET socketobj;
socketobj = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketobj == INVALID_SOCKET)
{
    printf("Socket Intialization Failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 0;
}
else

{
    printf("Socket Intialization Success\n");
}

Sleep(10000);
return 0;
}

6voto

Mysticial Points 180300

Sans voir le code, c'est difficile à dire.

Mais je pense que vous avez des déclarations et du code intercalés. Le compilateur C de MSVC n'est que C89 qui ne le supporte pas. Cela expliquerait pourquoi le compilateur C++ l'accepte, mais pas le compilateur C.

Avant C99, toutes les déclarations devaient se trouver au début de la fonction ou d'un bloc.

EDIT : Votre code ne montre pas la totalité de la fonction, mais vous avez probablement du code (non-déclaré) avant la fonction SOCKET socketobj; déclaration.


Maintenant que la fonction complète est affichée, cela confirme que vous entrelacez les déclarations et le code :

WORD wVersionRequested;            //  Declaration: ok
WSADATA wsaData;                   //  Declaration: ok
int wsaerr;                        //  Declaration: ok
wVersionRequested = MAKEWORD(2,2); //  Code: ok

...

SOCKET socketobj;                  //  Declaration: NOT ok
socketobj = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

La solution ici est de déplacer SOCKET socketobj; au début de la fonction avec les autres déclarations.

2voto

friol Points 4806

Il existe des différences entre le C et le C++. Par exemple, en C89, vous ne pouvez pas déclarer une variable au milieu d'un bloc de code, mais seulement au début.

0voto

Tobias Schlegel Points 3219

Jetez un coup d'œil à la description de l'erreur : http://msdn.microsoft.com/en-us/library/76c9k4ah%28v=vs.71%29.aspx

En changeant l'extension en .cpp, Visual Studio utilise le compilateur C++ au lieu du compilateur C (qui est un langage très différent).

Vous avez donc probablement écrit du code C++ et l'avez introduit dans le compilateur C, ce qui a entraîné (par coïncidence) l'apparition de cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X