【问题标题】:Function prototyping in CC语言中的函数原型
【发布时间】:2012-04-13 23:49:58
【问题描述】:

今天 Clang,试图编译一个程序,给了我一个奇怪的信息。我对 C 没有什么经验,所以我可能做错了什么,但我实际尝试过的代码是这样的:

#include <stdio.h>
#include <stdlib.h>

int sum(a,b);

int main ()
{
    printf(sum(1,2));
    return 0;
}

int sum (int a, int b)
{
    return a + b;
}

您可能已经注意到,在声明函数“sum”时,我没有包括参数。类型,所以会出现错误,但 Clang 给我的实际消息是这样的:

ind.c:4:9: error: a parameter list without types is only allowed in a function definition
int sum(a,b);
        ^
ind.c:12:5: error: redefinition of 'sum' as different kind of symbol
int sum (int a, int b)
    ^
ind.c:4:5: note: previous definition is here
int sum(a,b);
    ^
2 errors generated.

Clang 说它只允许在函数定义中是什么意思? int sum(a,b); 不是函数定义吗?

【问题讨论】:

  • 另外,当你尝试printf 的返回值sum(1,2) 时,你会遇到一些问题。请改用printf("%d", sum(1,2))

标签: c clang function-prototypes


【解决方案1】:

不,int sum(a, b); 是,或者说看起来像,一个函数声明,而不是一个定义

函数声明为编译器提供了足够的信息来生成对函数的调用。定义提供了声明,此外,还定义了调用函数时将执行的代码({} 之间的内容)。

函数声明(不是定义的一部分)可能包括参数的类型,或类型及其名称,但不仅仅是它们的名称。 (如果它包含类型,它就是一个原型。)

old-style 函数定义可以只包含参数的名称,例如:

int sum(a, b)
int a;
int b;
{
    return a + b;
}

但旧式定义和声明已过时,最好避免使用。旧式声明没有指定参数类型的数量,因此编译器无法验证调用的正确性。

您的声明可能如下所示:

int sum();

但它应该看起来像这样:

int sum(int a, int b);

甚至这个:

int sum(int, int);

哦,int main () 最好写成int main(void)

【讨论】:

  • 感谢您的解释,基思。非常简洁明了。你应该得到这个最佳答案。
【解决方案2】:

int sum(); 是一个函数声明。它为函数命名,但不告诉编译器它做了什么。告诉编译器它做了什么是定义函数,这就是它的意思。如果不是分号,而是带有语句的大括号,那么您将有一个函数定义。

【讨论】:

  • 感谢您花时间回答,格雷厄姆。我得到了它。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2011-10-12
  • 2016-08-19
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多