c语言 - 为什么这个源代码使用 "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 编译。

给出如下警告:

初始化使指针从没有强制转换的整数变成

谁能解释一下这个警告以及如何正确地避免它?

您必须将功能测试宏放在所有 include之前。在您的情况下,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;
}

最新更新