Почему этот исходный код, использующий "crypt", имеет следующее предупреждение компилятора:
#include <stdio.h>
#define _XOPEN_SOURCE
#include <unistd.h>
int main()
{
const char *key = NULL;
const char *salt = NULL;
crypt(key, salt);
return 0;
}
использование gcc test.c -o test -Wall -lcrypt
Скомпилировать.
Который дает это предупреждение:
инициализация делает указатель из целого числа без приведения
Может кто-нибудь объяснить это предупреждение и как правильно его избежать?
1 ответ
Решение
Вы должны поместить макросы функциональных тестов, прежде чем все включает. В твоем случае, stdio.h
уже включает features.h
за кулисами, который заботится о преобразовании функции определяет (как _XOPEN_SOURCE
) во что-то внутреннее использование заголовков. Поэтому, когда вы включаете unistd.h
, флаги уже установлены и больше не будут интерпретироваться, таким образом, _XOPEN_SOURCE
в то же время не будет иметь никакого эффекта.
Изменение порядка решает проблему:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
const char *key = NULL;
const char *salt = NULL;
crypt(key, salt);
return 0;
}