Разница компиляции C и C ++ - PullRequest
2 голосов
/ 24 января 2012

У меня есть кусок кода, который выглядит как

#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>


int main(int argc, char *argv[])
{
    struct hostent *server;
    server = gethostbyname(argv[1]);
    struct in_addr * address=(in_addr * )server->h_addr;
        fprintf(stderr,"[%d] [%s] server [%s] \n",__LINE__,__func__,inet_ntoa(*address));
}

Когда я использую компилятор g ++, он компилируется, но то же самое выдает следующую ошибку с компилятором gcc

myclient.c: In function ‘main’:
myclient.c:10:31: error: ‘in_addr’ undeclared (first use in this function)
myclient.c:10:31: note: each undeclared identifier is reported only once for each function it appears in
myclient.c:10:41: error: expected expression before ‘)’ token

Я что-то здесь упускаю?

Ответы [ 4 ]

4 голосов
/ 24 января 2012

Вы должны использовать struct in_addr, а не только in_addr в c коде (при касте тоже).

3 голосов
/ 24 января 2012

Важно отметить, что C имеет несколько пространств имен. Общее пространство имен включает в себя typedefs и другие идентификаторы, но есть отдельное пространство имен для теги структуры, перечисления и объединения; еще один для меток, а также для каждой структуры имеет свое собственное пространство имен. В коде так:

struct name {
    int name;
} name;

name означает 3 совершенно разные вещи, и это совершенно законно. к избегая ввода ключевого слова struct, программисты часто вводят новое имя для структура и ее тег:

typedef struct name {
    int name;
} my_struct;

my_struct s1; /* easier than: struct name s1 */
my_struct s2;

В этом последнем примере имя может быть даже опущено, если вы не хотите использовать указатель на структуру внутри себя. Эта практика была настолько распространена, что в C ++ компилятор считает тег определенного типа для структур. Это прекрасно законно в C ++:

struct my_struct {
    int name;
};

my_struct s1;
my_struct s2;

И действительно, это то, что происходит в вашей программе. Вы используете тег struct как тип, но это только допустимый тип в C ++. У вас есть две альтернативы:

1. Введите структуру в ее объявлении

typedef struct in_addr {
    /* ... */
} in_addr;

2. Используйте ключевое слово struct для ссылки на тип структуры

(struct in_addr *)

Первый не применим, так как вы не объявили структуру. Это уже идет таким путем. Так что я бы придерживался второго.

2 голосов
/ 24 января 2012

Изменение:

struct in_addr * address=(in_addr * )server->h_addr;

на:

struct in_addr * address=(struct in_addr * )server->h_addr;

Кроме того, C (до C99) допускает объявления переменных только в верхней части блока, а struct in_addr * address - нет.

0 голосов
/ 24 января 2012

C и C ++ имеют разные правила для структурных типов; в C ++ ключевое слово struct создает тип класса, все члены которого по умолчанию public. Это имя типа может стоять отдельно, в отличие от C.

C ++ - это не просто расширенный набор C, и существует множество кода, который будет компилироваться как один, но не как другой, или будет вести себя по-разному из-за различной семантики.

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