Здравствуйте. Пользуюсь компилятором MinGW. Вот код: Код (Text): #include <winsock2.h> #include <stdio.h> #include <windows.h> int main() { char* header="GET / HTTP 1.1\nHost: localhost\nUser-Agent: MyBot\nAccept: */*\nPragma: no-cache\nCache-Control: no-cache\0"; WORD wVersionRequested; WSADATA wsaData; SOCKET hSocket, client_socket; sockaddr_in client_addr; char msg[25]; int msg_len, client_addr_len; wVersionRequested = 2; WSAStartup(wVersionRequested, &wsaData); puts ("HTTP. GET.\n\n"); puts (header); return 0; } При попытке компиляции с помощью gcc (т.е. как программу на C) с параметром -lws2_32 вылезает ошибка "sockaddr_in undeclared (first use in this function)". А если компилирую с помощью g++ (т.е. как программу на C++) с таким-же параметром - то успешно компилируется. Мне хотелось бы, чтобы код компилировался под "C" компилятором. Скажите пожалуйста, в чем причина этого явления и как исправить.
Не получилось. Вот то что я нашел в winsock2.h Код (Text): struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; Все это правильно обьявлено?
int main() это определение функции в старом стиле по стандарту надо писать int main(void) в определении и в прототипе вот что по этому поводу пишут Керниган и Ритчи книга K&R ANSI C Имеются два способа объявления функции. В новом способе типы параметров задаются явно и являются частью типа функции; такое объявление называется прототипом функции. При старом способе типы параметров не указываются. Способы объявления функций обсуждаются в A8.6.3 и A10.1. Если вызов находится в области видимости объявления, написанного по-старому, каждый его аргумент подвергается операции повышения типа: для целочисленных аргументов осуществляется целочисленное повышение (A6.1), а для аргументов типа float - преобразование в double. Если число аргументов не соответствует количеству параметров в определении функции или если типы аргументов после повышения не согласуются с типами соответствующих параметров, результат вызова не определен. Критерий согласованности типов зависит от способа определения функции (старого или нового). При старом способе сравниваются повышенный тип аргумента в вызове и повышенный тип соответствующего параметра; при новом способе повышенный тип аргумента и тип параметра (без его повышения) должны быть одинаковыми. Если вызов находится в области видимости объявления, написанного по-новому, аргументы преобразуются, как если бы они присваивались переменным, имеющим типы соответствующих параметров прототипа. Число аргументов должно совпадать с числом явно описанных параметров, если только список параметров не заканчивается многоточием (, ...). В противном случае число аргументов должно быть больше числа параметров или равно ему; "скрывающиеся" под многоточием аргументы подвергаются операции повышения типа (так, как это было описано в предыдущем абзаце). Если определение функции задано по-старому, то типы параметров в прототипе, которые неявно присутствуют в вызове, должны соответствовать типам параметров в определении функции после их повышения. Эти правила особенно усложнились из-за того, что они призваны обслуживать смешанный способ (старого с новым) задания функций. По возможности его следует избегать. Очередность вычисления аргументов не определяется, в разных компиляторах она различна. Однако гарантируется, что аргументы и именующее выражение функции вычисляются полностью (включая и побочные эффекты) до входа в нее. Любая функция допускает рекурсивное обращение.
osox В определении функции по-барабану как писать, main() или main(void). Пишешь про определение, а приводишь цитату про объявление.
Проблема решена. В нужно исправить обьявление структуры. Код (Text): typedef struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; } sockaddr_in;