Проблема приведения с функцией realpath (программирование c)

Когда я компилирую следующий код:

#define _POSIX_C_SOURCE 200112L
#define _ISOC99_SOURCE
#define __EXTENSIONS__

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>    

int
main(int argc, char *argv[])
{
    char *symlinkpath = argv[1];
    char actualpath [PATH_MAX];
    char *ptr;
    ptr = realpath(symlinkpath, actualpath);
    printf("%s\n", ptr);
}

Я получаю предупреждение в строке, содержащей вызов функции realpath:

warning: assignment makes pointer from integer without a cast

Кто-нибудь знает, что случилось? Я использую Ubuntu Linux 9.04

2 ответа

Решение

Это очень просто. Glibc рассматривает realpath() как расширение GNU, а не POSIX. Итак, добавьте эту строку:

#define _GNU_SOURCE

... до включения stdlib.h, чтобы он был создан и создан для создания прототипа char *, В противном случае, gcc будет предполагать, что возвращает тип по умолчанию int, Прототип в stdlib.h не виден, если только _GNU_SOURCE определено.

Следующее соответствует без предупреждений с -Wall пройдено:

#include <stdio.h>
#include <limits.h>

#define _GNU_SOURCE
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    char *symlinkpath = argv[1];
    char actualpath [PATH_MAX];
    char *ptr;
    ptr = realpath(symlinkpath, actualpath);
    printf("%s\n", ptr);

    return 0;
}

Вы увидите похожее поведение с другими популярными расширениями, такими как asprintf(). Стоит взглянуть на /usr/include/, чтобы увидеть, как именно включается этот макрос и что он меняет.

Компилятор не знает что realpath есть, поэтому предполагается, что это функция, возвращающая int. Это происходит по историческим причинам: многие старые программы на С полагались на это.

Вы, вероятно, пропускаете декларацию об этом, например, забывая #include его заголовочный файл.

Другие вопросы по тегам