【问题标题】:Clarification regarding default return type at global space关于全局空间默认返回类型的说明
【发布时间】:2018-08-28 17:51:20
【问题描述】:

在制作函数atof时,我将整个工作分成两个独立的翻译单元:


m.c

  #include<stdio.h>

  extern  fun(char[]);  //return type not mentioned on purpose


  int main()
  {
     printf("%d\n",fun("+123.980")); //%f would also display 0.000000
     return 0;
  }

n.c

   #include<ctype.h>

   float fun(char c[])
   {
       float val=0, pow=1;
       int i;
       int sign;

       for(i=0;isspace(c[i]);i++); //SKIPPING WHITESPACE IF ANY

       if(c[i]=='+')
           sign = 1;
       if(c[i]=='-')
           sign =-1;
       ++i;

       for(;c[i]!='.';i++)
           val = val*10 + (c[i]-'0');
       ++i;

       while(isdigit(c[i]))
       {
            val = val*10 + (c[i]-'0');
            pow=pow*10;
            ++i;
       }

       return sign*val/pow;   
   }

警告说,在这种情况下,函数的类型将默认为int,因为全局空间中没有明确提及任何返回类型的每个变量/函数类型都默认为 int。

我希望输出是 +123.980int 版本,即只有 123。 但相反,它显示 0(否则函数工作正常)。为什么?

【问题讨论】:

  • 如果声明的类型与定义的类型不匹配,则为未定义行为。
  • 返回类型被隐式采用int 并不意味着您可以期望您的float转换int。这意味着调用者将假定它已经一个int。如果实际情况并非如此,则语言不会指定会发生什么。
  • 它默认为类型的事实并不重要。如果您明确输入 int 返回类型,也会发生同样的事情。它仍然与函数返回的实际类型不匹配,因此它是未定义的行为。
  • 此外,现代 C 不再具有任何级别的隐式类型。接受它的编译器这样做只是为了向后兼容。不要编写依赖它的代码。

标签: c


【解决方案1】:

隐式 int 和隐式函数声明已从 C 语言中删除。他们不再是了。该程序格式错误。如果您的编译器接受它,那么您正在处理供应商扩展 - 或针对过时 C 版本的编译器。

在删除这些东西之前,该程序有未定义的行为。该标准的所有版本都要求程序中实体的所有声明必须兼容,无论其中的任何内容是否隐含。违反此规则会导致未定义的行为,无需诊断。

【讨论】:

  • 我不知道 任何 编译器不接受隐式 int 和隐式函数声明,即使在据称严格符合最新版本的模式下也是如此C标准。 (可能有一个选项可以专门针对这些结构出错,但它通常被记录为将警告变成错误。)因此,我认为将这些功能描述为“从 C 语言中删除”过于苛刻,即使根据标准的字母,您是正确的。
  • @zwol You'd be surprised 和 -pedantic-errors 的意思就是,在实际违反标准时出错。不是将所有警告都转化为错误,也不是将一个特定的警告转化为错误,而是将错误诊断为错误
  • 啊,不,又不是这种误解。 -pedantic-errors 只是 -Werror=pedantic 的旧名称,即将关于 C 标准禁止的构造的警告(1990 年代初期的 GCC 开发人员认为禁止它们是愚蠢的)变成错误。 GCC 的严格符合模式被记录为-std=cXX -Wall -Wpedantic,在这一点上不要通过与手册相矛盾来混淆人们。
  • @zwol "啊,不,这又不是这种误解。-pedantic-errors 只是 -Werror=pedantic 的旧名称" 不,不是。我引用的 GCC 手册说得很清楚,这不等同于 -Werror=pedantic
  • 这是一个错误。奇怪的是他们选择记录错误而不是修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多