关于全球空间的默认返回类型的说明

inf*_*ite 0 c

在创建函数时atof,我将整个工作分成两个单独的转换单元:


MC

  #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;
  }
Run Code Online (Sandbox Code Playgroud)

NC

   #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;   
   }
Run Code Online (Sandbox Code Playgroud)

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

我期待输出int版本为+123.980,即仅123.但相反它显示0(否则功能正常).为什么?

n. *_* m. 7

从C语言int删除了隐式和隐式函数声明.他们已经不复存在了.该计划格式不正确.如果您的编译器接受它,那么您正在处理供应商扩展 - 或者是C的过时版本的编译器.

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

  • 我不知道_any_编译器不接受隐式的`int`和隐式函数声明,即使在涉嫌严格符合C标准的最新版本的模式中也是如此.(可能有一个选项可以在这些构造上特别错误,但它通常被记录为对错误发出警告.)因此我认为将这些功能描述为"从C语言中删除"太过苛刻,即使根据标准的字母你是对的. (2认同)