【问题标题】:What is the purpose of defining such a function?定义这样一个函数的目的是什么?
【发布时间】:2017-12-10 16:22:54
【问题描述】:
int func (int,int);

int main ()
{ 
     printf("hello");
}

考虑上面的函数。定义func 之类的函数的目的是什么?我多次看到这种情况。

【问题讨论】:

  • 这不是函数定义,而是函数原型。 Prototypes 报告最少的信息,以允许编译器使用可以在其他地方(即在对象库中)定义的函数。从原型中了解函数返回什么以及获取哪些参数就足以将其正确链接到您的代码。

标签: c function


【解决方案1】:
int func(int, int);

定义一个函数,而是通过提供它的原型来声明它。这是对编译器的“承诺”,最新的链接器将提供一个暴露此类功能的模块。

函数的原型涵盖了它的:

  • 返回类型
  • 姓名
  • 参数的类型和顺序

参数的名称与声明的上下文无关。

只需要为函数的实现提供函数的参数名称,可能如下所示:

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

另一方面

int func(int a, int)
{
  return a;
}

无效

C 标准明确规定:

6.9.1/5 Function definitions

如果声明符包含参数类型列表,每个参数的声明应 包括一个标识符,除了由单个参数组成的参数列表的特殊情况 void 类型的参数,在这种情况下不应有标识符。无申报清单 应该跟进。

【讨论】:

  • 你试过编译这个“无效”的代码吗?它看起来有效。在实现中不提供参数名称是一种用于抑制“未使用参数”警告的技术
  • @RSFalcon7:我希望尝试编译 int func(int a, int) { return a; } 会导致这样的错误:至少在 C 中是 error: parameter name omitted,不确定 C++。
  • @RSFalcon7:“用于抑制“未使用参数”警告”我认为这是对 C 标准的供应商特定扩展。请通过引用 C 标准的相关部分来证明我错了。
  • @RSFalcon7:请参阅此讨论:stackoverflow.com/q/8776810/694576 C 和 C++ 之间似乎还有一点细微差别。
【解决方案2】:

所有其他答案都没有明确回答正确的问题,所以我在这里添加一个。

首先,它不是函数定义,因为缺少主体。这种语义称为函数声明

在调用函数之前,编译器需要知道函数到底是什么。这被称为“原型”。在生成正确的代码来调用函数之前,必须知道原型。考虑这段代码:

// No previous info
int a = func(1, 3);

编译器不知道它调用的是int func(int, int)还是long func(char, double),如果实际函数是FILE* func(void*),它也不能进行错误检查。

通过提供正确的原型,编译器能够执行必要的检查并生成该函数调用的相应代码。

【讨论】:

    【解决方案3】:

    这不是函数定义,而是函数声明。函数声明告知编译器函数的参数个数、函数参数的类型和函数返回值的类型。

    1) 它告诉函数将返回的数据的返回类型。

    2) 它告诉传递给函数的参数数量。

    3) 它告诉每个传递的参数的数据类型。

    4) 它还告诉了参数传递给 功能。

    5) 它告诉函数的名称(标识符)。

    【讨论】:

    • 5) 它告诉函数的名称(标识符)。
    【解决方案4】:

    这只是一个函数的函数声明,告诉编译器存在一个名为 func 的函数,并在末尾定义。
    考虑这个例子:

       #include<stdio.h>
        int func (int,int);
        int main()
        {
             printf("hello\n");
             int c= func(5,4);
             printf("%d\n",c);
    
        }
        int func(int a, int b)
        {
    
             return a+b;
        }
    

    【讨论】:

    • return 不是函数。没有必要将它的论点扭曲成括号。
    • 形式上没有错,没有错,因为return ((a) + (b));不会错。
    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多