【问题标题】:why it is necessary to use semicolon after functions prototype [closed]为什么必须在函数原型后使用分号[关闭]
【发布时间】:2015-11-20 18:47:58
【问题描述】:

为什么我们在第二行的int add(int,int) 语句之后使用分号。

#include<stdio.h>
int add(int,int);
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=add(a,b);
printf("The sum of the 2 numbers is %d",c);
return 0;
}
int add(int x,int y)
{
int sum;
sum=x+y;
return sum;
}

【问题讨论】:

  • 为了和函数实现区分开来。
  • 因为否则编译器会期望您在大括号中提供函数的定义 ({ })
  • 因为这是指定语言的方式。

标签: c function declaration function-prototypes


【解决方案1】:

在C语法声明中定义如下方式

declaration:
    declaration-specifiers init-declarator-listopt ;
                                                  ^^^ 

如您所见,分号是必需的。

还有这个

int add(int,int);

是一个函数声明。因此,您必须在声明的末尾放置一个分号。

比较两个程序

int main( void )
{
    int add( int x, int y )

    {
        //...    
    }
}

int main( void )
{
    int add( int x, int y );

    {
        //...    
    }
}

第一个程序无效,因为编译器会认为函数add是在函数main中定义的。

第二个程序有效。 main 中有一个函数声明和一个代码块。

因此需要分号来区分声明与其他程序构造。

【讨论】:

    【解决方案2】:
    int add(int, int);
    

    这是一个前向声明 - 它是一种告诉编译器“有一个名为 'add' 的函数需要两个整数,所以如果你看到我使用它,相信我,我稍后会定义它”。因为你还没有定义它,所以你不需要{} 后面的花括号。分号出现在 C 中每一行代码的末尾,除了某些大括号之后(例如 if 语句、函数定义)。所以前向声明后仍然需要分号。

    【讨论】:

    • 那么,如果这是一个 forward 声明,那么你应该是一个 backward 声明(或任何其他声明)吗?为什么不需要分号?
    • @Olaf,C 中没有后向声明。定义函数后无需声明函数,因为编译器已经知道它存在。它不需要分号,因为这是 C 规范 - 函数定义、if/else/case 语句和预处理器定义显然没有充分的理由不使用分号:) 编辑:C/C++ 混合。规则仍然适用
    • 语言错误。这不是 C++,而是 C。
    • 嗯,其实定义也是声明。这就是为什么您不需要稍后声明它的原因。仅供参考:此外还有暂定定义
    • 定义后的声明将用于检查它们是否匹配。无数的#include 文件会掩盖各种定义/声明的可见性。我在调试中使用过这个。
    【解决方案3】:

    分号结束 C 中的语句。所以分号告诉 C 声明 add 函数的语句已经终止,接下来是一个新语句。 在这种情况下,这是一个函数declaration,分号表示没有什么可以期待的。如果没有分号,函数 definition 将需要花括号,如 main() {...}

    【讨论】:

    • 好吧,在文件级别,您没有任何语句,只有声明和定义。
    • 为什么我被否决了?这是一个错误的答案吗?
    • 阅读我的评论。定义也是声明。
    【解决方案4】:

    如果没有分号,编译器会期望一个函数定义(以左大括号开头),或用逗号将一个定义与下一个定义分开。

    【讨论】:

      【解决方案5】:

      分号只是一个终止字符。由于没有定义函数的主体(例如,与 main() { ... } 不同),这是一种让编译器知道不要期待其他任何东西的方法。

      【讨论】:

        【解决方案6】:

        了解什么是 C/C++ 中的声明和定义非常重要。当你声明一个变量或函数时,你是在告诉编译器有一些名字被指定了类型的东西。编译器不必获取变量或函数的完整定义。

        在这个例子中,函数是先声明后定义的。声明语句的语法应包含分号。

        您可以通过阅读以下内容获得更清晰的概念:http://www.cprogramming.com/declare_vs_define.html

        【讨论】:

        • 只是为了澄清:没有语言 C/C++。他们是不同的语言! C++ 不是“带类的 C”。 (这样想的人太多了)
        • 是的,你是对的 - C++ 涉及更多的概念,尤其是在 C++ 11/14 之后,但语法类似于 C。
        【解决方案7】:

        这是必要的历史原因是,最初,在 K&R C 中,add() 会被写成:

        int add()
        int x;
        int y;
        {
          return x+y;
        }
        

        如果原型后面没有分号,则很难将其与以下内容区分开来:

         int add();
         int x;
         int y;
        
         {
           /* A nested block. */
         }
        

        请记住,C 预处理器是一维的,它将程序转换为由空格分隔的标记列表。解析器看不到换行符或缩进来猜测您的意思。

        此外,C 语言中的语句通常以分号结尾,与让程序员记住一堆任意异常相比,保持一致更容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          相关资源
          最近更新 更多