Почему этот исходный код, использующий "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;
}
Другие вопросы по тегам