Различия между MSVC 10.0 c и С++

У меня возникли трудности с компиляцией программы C ниже. Это только начало моих попыток понять winsock. Проблема в том, что при компиляции программы client.c я получаю ошибку (C2143) отсутствует ';' перед «типом». Но когда я переименовываю исходный файл в «client.cpp», программа компилируется без ошибок или предупреждений. Я не понимаю синтаксическую ошибку, которая является ошибкой в ​​C, но не в C++.

#define WIN32_LEAN_AND_MEAN
#define DEBUG

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define PORT "12186"
#define BUFFERLEN 512

int main(int argc, char* argv[])
{
    /*
        Variable Declorations
    */
    WSADATA wsaData;
    SOCKET ConnectionSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    int addrResult;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC; //unspecified so we can be compatible with IPv4 and IPv6
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    #ifdef DEBUG
    printf("IPPROTO_TCP: %d", IPPROTO_TCP);
    #endif

    //Buffers
    char * sendbuffer; // Error C2143
    char recievebuffer [BUFFERLEN]; //Error C2143

    //Initialize Winsock
    addrResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(addrResult !=0)
    {
        printf("WSAStartup failed: %d", addrResult);
    }
    addrResult = getaddrinfo(argv[1], PORT, &hints, &result);
    if(addrResult != 0)
    {
        printf("getaddrinfo failed: %d", addrResult);
        WSACleanup();
        return 1;
    }
    return 0;
}

Изменить: объявления переменных C должны идти перед всем остальным кодом в функциях MSVC C. Задача решена. Это C89 или просто MSVC?


person Parker Philip Roberts-Gibson    schedule 12.07.2012    source источник


Ответы (2)


Проблема может заключаться в том, где находятся объявления переменных. Поместите их в начало функции с другими переменными.

Посмотрите последний пример из MSDN, который может вызвать этот код ошибки.

person Mahesh    schedule 12.07.2012
comment
В программе на C переменные должны быть объявлены в начале функции, и они не могут быть объявлены после того, как функция выполнит инструкции без объявления. Спасибо! Перемещение объявлений переменных над значениями настроек для подсказок позволило компилятору c выполнить компиляцию без ошибок. - person Parker Philip Roberts-Gibson; 13.07.2012

Компилятор C, который поставляется с VS, реализует только C89 (серьезно...), поэтому вы должны объявить все свои переменные в начале данной функции.

person Ed S.    schedule 12.07.2012