OS 上的 C 生成文件冲突类型错误



我一直在尝试通过OSX Catalina上的makefile编译C代码,但得到错误。当我在 Ubuntu 上编译代码时,它成功了,但在 OSX 上,我在编译结束时遇到以下错误:

gcc -c -ansi   -g scan-fct_pddl.tab.c
scan-fct_pddl.y:858:6: error: conflicting types for 'fcterr'
void fcterr( int errno, char *par ) {
^
scan-fct_pddl.y:174:3: note: previous implicit declaration is here
fcterr( PROBNAME_EXPECTED, NULL ); 
^
1 error generated.
make: *** [scan-fct_pddl.tab.o] Error 1

我觉得奇怪的是,这个错误只在OSX上编译代码时才会抛出。 我已经尝试了不同版本的 gcc,并且还更新了野牛和 flex,但仍然遇到此错误。

更新

通过更改提及冲突类型的前向声明的签名中的参数名称来修复错误。 确保在声明函数时也匹配新签名。

您的代码在声明/定义函数之前fcterr(PROBNAME_EXPECTED, NULL);调用该函数。有点像这样:

// trying to use this function before it has been declared / defined
fcterr( PROBNAME_EXPECTED, NULL ); 

// Later in the code it is defined here
void fcterr( int errno, char *par ) {
// ...
}

注意:c 中的隐式声明的返回类型为int,这与返回类型void不兼容。

您可以执行以下两项操作之一:

在使用之前移动函数的定义

// Define the function here
void fcterr( int errno, char *par ) {
// ...
}
// Now the compiler knows what this function is
fcterr( PROBNAME_EXPECTED, NULL ); 

在使用之前声明函数 - 通常在头文件中完成:

// Declare the function (this could/should go in a header)
void fcterr(int errno, char *par);
// Now the compiler knows what this function is
fcterr( PROBNAME_EXPECTED, NULL ); 
// Later in the code it is implemented here
void fcterr( int errno, char *par ) {
// ...
}

我很惊讶您在 Ubuntu 版本中没有遇到此问题 - 您确定两个构建之间没有区别吗? - 我怀疑您可以通过更改生成文件来解决此问题! - 除非我缺少一些信息...

更新

代码中似乎存在错误。您可以在 ~101 行取消注释scan-fct_pddl.y,作者可能试图在其中声明他的函数:

/* declare funct */
void fcterr( int errnum, char *par );

然后稍后在同一文件中声明该函数(~第 878 行(:

void fcterr( int errno, char *par ) {
}

现在这里的问题是,通过在顶部声明函数,我们现在得到一个错误而不是警告。这是因为在这个函数 def(~第 867 行(上方,它们包含lex.fct_pddl.c(puke(,无论如何,在该文件中大约一半时,它们包含errno.h请注意,errno也是第一个参数的名称。在 errno.h 的某个地方,我相信errno#define 是别的东西——现在这真的很糟糕!- 因为这个人写的函数现在可能与它应该的样子不同。

一个简单的解决方法是重命名该参数:

void fcterr( int errnum, char *par ) {
}

因此,取消注释顶部的声明并重命名该参数。这应该可以解决此问题- 并且确实需要修复。

最新更新