为什么使用“crypt”的源代码会出现此编译器警告:

时间:2014-08-15 10:02:42

标签: c linux 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 个答案:

答案 0 :(得分:3)

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