C 条件表达式中的指针类型不匹配:编译器之间的行为不同
示例代码:C 条件表达式中的指针类型不匹配:编译器之间的行为不同,c,compiler-errors,compiler-warnings,C,Compiler Errors,Compiler Warnings,示例代码: int f1(char c){ return c; }; int f2(int i ){ return i; }; int main(void) { return (1 ? f1 : f2)(0); } 编译器之间的不同行为: gcc (latest): gcc prog.c -Wall -Wextra -std=c89 -pedantic prog.c: In function 'main': prog.c:6:18: warning: pointer type misma
int f1(char c){ return c; };
int f2(int i ){ return i; };
int main(void)
{
return (1 ? f1 : f2)(0);
}
编译器之间的不同行为:
gcc (latest): gcc prog.c -Wall -Wextra -std=c89 -pedantic
prog.c: In function 'main':
prog.c:6:18: warning: pointer type mismatch in conditional expression
6 | return (1 ? f1 : f2)(0);
| ^
prog.c:6:18: error: called object is not a function or function pointer
6 | return (1 ? f1 : f2)(0);
| ~~~~~~~~^~~~~
prog.c:7:1: warning: control reaches end of non-void function [-Wreturn-type]
7 | }
| ^
问题:
调用对象类型'void*'
,而gcc调用对象
?这个void*
来自哪里int f1(char c) { return c; }
int f2(int i) { return i; }
int main()
{
int (* f)(int);
f = (1 ? f1 : f2);
return f(0);
}
和预期的一样,但我并没有很好的答案给你——只是在有助于你或其他人解决你的问题的情况下发布 这将编译:
int f1(char c) { return c; }
int f2(int i) { return i; }
int main()
{
int (* f)(int);
f = (1 ? f1 : f2);
return f(0);
}
和预期的一样,但我并没有很好的答案给你——只是在有助于你或其他人解决你的问题的情况下发布 前两个与c89相比,后一个没有标准…MSVC:main()中的行警告:
main()
:形式参数1不同于声明而且MSVC没有在严格的c89模式下编译C的选项。从参考资料中:“不可能指定严格的C89一致性”。如果我从f1()
和f2()
返回更有意义的值,并打印结果,我可以看到MSVC调用函数f1()
,或者f2()
,如果我更改三元值。C标准草案N1570 6.5.15说:“限制:。。。第二个和第三个操作数应满足以下条件之一:。。。“您的代码不满足列表中的任何约束条件。因此,您的代码无效。前两个代码与c89进行比较,后一个代码与c89进行比较……MSVC:对main()中的行发出警告”
:与声明不同的形式参数1此外,MSVC没有在严格C89模式下编译C的选项。参考:“无法指定严格C89一致性”。如果我从f1()
和f2()
返回更有意义的值,并打印结果,我可以看到MSVC调用函数f1()
,或f2()
如果我更改三元值。C标准草案N1570 6.5.15说:“约束:。。。第二个和第三个操作数应满足以下条件之一:。。。“您的代码不满足列表中的任何约束条件。因此,您的代码无效。
int f1(char c) { return c; }
int f2(int i) { return i; }
int main()
{
int (* f)(int);
f = (1 ? f1 : f2);
return f(0);
}