Ошибка компилятора C2275 - PullRequest
2 голосов
/ 04 марта 2012

Я программировал простое приложение WinSock в Visual Studio 2010. Я назвал точку входа моего приложения "main.c", а затем столкнулся с этой ошибкой при объявлении объекта SOCKET:

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

Как ни странно, я решил эту проблему, переименовав файл кода из main.c в main.cpp

Просто из любопытства я хочу знать, чтосмысл этой ошибки и какая разница произошла при изменении расширения.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Вот соответствующий код:

#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;
}

Ответы [ 3 ]

6 голосов
/ 04 марта 2012

Трудно сказать, не видя код.

Но я предполагаю, что у вас есть чередующиеся объявления и код. Компилятор C MSVC - только C89, который его не поддерживает. Это объясняет, почему компилятор C ++ принимает его, а компилятор C - нет.

До C99 все объявления должны быть в начале функции или блока.

РЕДАКТИРОВАТЬ: Ваш код не показывает всю функцию, но у вас, вероятно, есть некоторый (не декларативный) код до объявления SOCKET socketobj;.


Теперь, когда показана полная функция, это подтверждает, что вы чередуете объявления и код:

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);

Решение здесь - переместить SOCKET socketobj; в начало функции с другими объявлениями.

2 голосов
/ 04 марта 2012

Есть различия между C и C ++. Например, в C89 вы не можете объявить переменную в середине блока кода, но только в начале.

0 голосов
/ 04 марта 2012

Посмотрите на описание ошибки: http://msdn.microsoft.com/en-us/library/76c9k4ah%28v=vs.71%29.aspx

Изменяя расширение на .cpp, Visual Studio использует компилятор C ++ вместо компилятора C (это совершенно другой язык).

Таким образом, вы, вероятно, написали код C ++ и передали его в компилятор C, что (по совпадению) привело к тому, что эта ошибка была выдана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...