繁体   English   中英

当我尝试在Linux而不是Mac上进行编译时,为什么会出现“错误:函数'fileno'的隐式声明”

[英]Why am I getting “error: implicit declaration of function ‘fileno’” when I try to compile on Linux but not on a Mac

如标题所示,当我尝试在Linux而不是Mac上进行编译时,出现以下错误:“函数'fileno'的隐式声明”。 我知道我可以用简单的行int fileno(FILE *stream);来解决它int fileno(FILE *stream); ,但我想知道为什么会这样。

您不应声明系统库提供的功能。 您应该适当地包含适当的标题。

由于fileno不是标准的C函数,因此通常不会在<stdio.h>声明它。 您必须定义一个合适的宏才能启用声明。

man fileno

glibc的要求(请参见feature_test_macros(7)):

fileno():_POSIX_C_SOURCE> = 1 || _XOPEN_SOURCE || _POSIX_SOURCE

在包含三个宏之前定义其中三个宏应该可以解决问题。

如果您记得包含<stdio.h> ,则此警告表明您的<stdio.h>没有声明此功能。

fileno不是标准功能。 完全希望某些实现不提供它,特别是如果您以严格的标准兼容模式进行编译。

如果您的代码仍然可以成功链接,则几乎可以肯定意味着您的Linux编译器设置将指导您的编译器以“严格”模式工作,从而迫使<stdio.h>来“隐藏” fileno声明。

我在Ubuntu 16.04计算机上编写了一个简单程序。 而且编译良好。

#include <stdio.h>

int main ()
{
    printf ("%d\n", fileno(stdout));

    return 0;
}

希望您知道<stdio.h>存在fileno 如果您没有包含头文件,请这样做并重新编译。

我不确定Mac版本为何能正常工作。

编辑:

我没有使用C99标准。 我编译使用: gcc -Wall -Werror test.c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM