Проблема приведения с функцией 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
его заголовочный файл.