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 | }
      | ^
问题:

  • C标准是怎么说的
  • gcc&clang:为什么被调用的对象不是函数或函数指针?那是什么
  • cl给出警告,但编译代码。这种行为符合C标准吗
  • 为什么clang
    调用对象类型'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);
    }