1

在浏览一些快板教程时,我发现了一个奇怪的电话。

int al_init();

该函数al_init()初始化 allegro 以便可以使用 allegro 函数。线是int al_init();怎么回事?如果我更改这行代码以排除int它,它的工作原理相同,但如果我完全取出该行,它就不起作用。这条线在做什么?我唯一能想象的是它创建一个整数并为其分配al_init()函数的返回值,这可能是-1失败和0成功等。但如果这是这样做的,那么你怎么能检查返回价值?

4

3 回答 3

2

在 C/C++ 中有函数声明和函数定义:

声明如下所示:

int a_function();
void another_function();
double yet_another_function();

解释:

  • 函数名前的标识符(例如int, voiddouble描述了函数返回值的类型。
  • 如果您未指定一个,则默认为int(这就是为什么它在您int从中删除时有效int al_init(),但在您完全删除声明时无效)
  • void意味着它不应该返回一个值(即使从技术上讲它可以,但这是针对极少数情况的)

定义如下所示:

int a_function() {
    std::cout << "hello world!";
    int x = 1;
    int y = 2;
    return (x + y);
}

注意区别:

  • 声明以;
  • 定义后面是用大括号括起来的代码块:{},但不是;
  • 在某些情况下,您不需要声明函数。如果它位于代码中已经看到定义的位置,则定义可以代替声明(这将我们引向下一点......)
  • 声明的目的是告诉程序,例如,有一个名为 的函数a_function,它不需要任何参数,并且它返回一个类型的值int
于 2012-11-05T03:36:53.487 回答
1

根据 C 的语法规则,原型定义为:

<return-type> function-name (param1, param2, ..);

函数调用定义为:

function-name(param1, param2,...);. 所以它显然定义了一个函数原型而不是调用该函数。

C89 和以前的规则是:

使用上述规则,另一个规则是:对于隐式整数返回类型,假设原型定义任何可执行函数代码之外。如果它在函数内部,它将被称为函数调用而不是函数原型定义。


除此之外,让我们从问题开始:

在浏览一些快板教程时,我发现了一个奇怪的电话。int al_init();

那是不正确的,它看起来像一个函数原型或声明

函数 al_init() 初始化 allegro 以便可以使用 allegro 函数。什么是 int al_init(); 线?如果我将这行代码更改为排除 int ,它的工作原理相同,但如果我完全删除该行,它就不起作用。

什么不起作用?停止编译?这很明显,因为它将无法找到al_init()功能。此外,它在没有“int”的情况下工作的原因是因为它隐含地假定返回一个整数。

这条线在做什么?

它告诉编译器al_init()库函数是在别处定义的,通常在 a .libor .aor.dll中,并且您希望在程序中使用它。

我唯一能想象的是它创建了一个整数并为其分配了 al_init() 函数的返回值,

对代码的绝对错误解释,它不会创建任何整数,也不会为其分配任何值。

可能是 -1 表示失败,0 表示成功等。但如果这是这样做的,那么你怎么能检查返回值呢?

由于您想知道该函数返回了什么,您可以在实际调用 al_init() 时执行此操作:

int retval = al_init(); printf("al_init() returned %d",retval);

于 2012-11-05T03:45:15.503 回答
1

你确定你不是在看函数声明吗?

于 2012-11-05T03:32:01.607 回答