Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c编译器的名称空间中有一个函数(可能?)。雨衣_C_Macos - Fatal编程技术网

c编译器的名称空间中有一个函数(可能?)。雨衣

c编译器的名称空间中有一个函数(可能?)。雨衣,c,macos,C,Macos,一周前,我在一段代码中创建了一个名为getline的函数,但它不起作用。从那时起,每当我命名一个函数getline并试图编译它时,它就不起作用了。如果我将函数的名称更改为其他名称,它将再次工作。我已经重新启动了我的电脑(虽然它真的不需要)。我怎样才能找回这个名称空间 错误消息示例: Numens-MBP:c examples mycotic$ cc testing.c testing.c:9:5: error: conflicting types for 'getline' int getlin

一周前,我在一段代码中创建了一个名为getline的函数,但它不起作用。从那时起,每当我命名一个函数getline并试图编译它时,它就不起作用了。如果我将函数的名称更改为其他名称,它将再次工作。我已经重新启动了我的电脑(虽然它真的不需要)。我怎样才能找回这个名称空间

错误消息示例:

Numens-MBP:c examples mycotic$ cc testing.c
testing.c:9:5: error: conflicting types for 'getline'
int getline(void);
    ^
/usr/include/stdio.h:448:9: note: previous declaration is here
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca...
        ^
testing.c:13:1: warning: type specifier missing, defaults to 'int'
      [-Wimplicit-int]
main()
^
testing.c:20:24: error: too few arguments to function call, expected 3, have 0
        while ((len = getline()) > 0)
                      ~~~~~~~ ^
/usr/include/stdio.h:448:1: note: 'getline' declared here
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca...
^
testing.c:36:5: error: conflicting types for 'getline'
int getline(void)
    ^
/usr/include/stdio.h:448:9: note: previous declaration is here
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca...
        ^
1 warning and 3 errors generated.
是一个标准的C库函数。您的函数与标准库中的定义冲突

为函数选择另一个名称。此函数是POSIX 2008的一部分;它不是POSIX 2001或POSIX 1997的一部分。在Mac上,即使指定了
-std=c11
,POSIX定义也默认启用

您可以通过指定不支持
getline()
的POSIX版本来解决此问题。考虑这个代码——但是忽略这个“<代码> GETLILE())<代码> >输出一行:

#include <stdio.h>

extern int getline(int);

int getline(int num)
{
    printf("%s: %d\n", __func__, num);
    return num + 1;
}

int main(void)
{
    for (int i = 0; i < 5; i++)
        printf("RV = %d\n", getline(i));
    return 0;
}
但是,如果通过添加
-D_POSIX_C_SOURCE=200112L
-D_POSIX_C_SOURCE=199506L
来指定与旧版本POSIX的一致性,那么它将干净地编译并正确运行,产生:

getline: 0
RV = 1
getline: 1
RV = 2
getline: 2
RV = 3
getline: 3
RV = 4
getline: 4
RV = 5

注意,这只是一个创可贴解决方案,它有影响——POSIX 2008的所有其他好的新特性不再可访问。


唯一的长期解决方案是接受
getline()
现在是“标准”C名称空间的一部分-标准是POSIX,当然不是ISO/IEC 9899:2011-并重命名该函数。(是的,这是一个麻烦,K&R第二版说明了三个版本的
getline()
,由于这个原因不再正常。我不得不为此重命名我的库函数。在以前版本的POSIX中,这个名称不在保留的名称空间中;没有办法猜测这是必要的。)

不是真的,这是平台上的标准配置。这不是一个标准的C函数。你确定以前使用“getline”作为函数名有效吗?“它起作用了”和“不再起作用了”之间还发生了什么?转台?编译器的开关?在您以前使用的
getline
函数中,您是否在Windows(或其他非POSIX)系统上更改了有关标题(位置、命名)的任何内容?还是你在编程C++?
getline: 0
RV = 1
getline: 1
RV = 2
getline: 2
RV = 3
getline: 3
RV = 4
getline: 4
RV = 5