【问题标题】:initialization makes pointer from integer without a cast when compiling编译时初始化使指针从整数而不进行强制转换
【发布时间】:2021-01-19 11:56:33
【问题描述】:

在编译以下代码时,我收到了来自 gcc 编译器的奇怪警告:

  int main( int argc, char *argv[] )
{
    int fdm;
    pid_t pid;
    fdm = posix_openpt( O_RDWR );
    pid = fork();
    if(pid==0)
    {
        if(grantpt(fdm) ==-1)
        {
            perror("grantpt");
            exit(EXIT_FAILURE);
        }
        if(unlockpt(fdm) ==-1)
        {
            perror("unlockpt");
            exit(EXIT_FAILURE);
        }
        char* name = ptsname(fdm);
        int fds = open(name,O_RDWR);
        if(fds ==-1)
        {
            perror("open");
            exit(EXIT_FAILURE);
        }
        close(0);
        close(1);
        close(2);
        dup(fds);
        dup(fds);
        dup(fds);
        execlp("cat","cat",NULL);
        perror("cat");
        exit(EXIT_FAILURE);
    }
    printf( "main: copied %d bytes\n", dblCOPY( STDIN_FILENO, fdm, fdm, STDOUT_FILENO ) );
 return 0;
}

这是警告:

warning: initialization makes pointer from integer without a cast [enabled by default]
   char* name = ptsname(fdm);

奇怪的是 ptsname 函数返回 char 指针,而不是编译器声称的整数,那么可能是什么问题?

【问题讨论】:

  • 可能没有ptsname的声明。你还没有显示#include的。
  • 在没有信息(没有原型(缺少包含文件?))的情况下,编译器假定ptsname() 返回一个int ...所以你有char* name = <intvalue>; 和警告
  • C 默认为 int 用于未声明的函数。不要忘记功能测试宏
  • VTC 不完整、美观且简单。您从未展示过您的main() 函数/文件应该如何知道ptsname() 的签名,所以它不知道,除非您打开几乎不是现代的 C 标准/警告,否则编译器会尝试为您猜测,然后警告它的猜测。
  • 我在任何地方都没有看到#include <stdlib.h>...

标签: c linux


【解决方案1】:

您可能需要在包含头文件之前定义一些功能测试宏,

参见手册页man feature_test_macros

有两种方法可以消除此警告,

  1. 通过添加上面的代码定义所需的功能测试宏

    #define _XOPEN_SOURCE
    #define _XOPEN_SOURCE_EXTENDED

    #include

    #include

    #include

    #include

  2. 或自己声明函数

    #include

    #include

    #include

    #include

    char *ptsname(int fd);

    int posix_openpt(int flags);

    int grantpt(int fd);

    int unlockpt(int fd);

希望这能解决问题

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2012-10-30
    • 2013-09-07
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多