在浏览一些快板教程时,我发现了一个奇怪的电话。
int al_init();
该函数al_init()
初始化 allegro 以便可以使用 allegro 函数。线是int al_init();
怎么回事?如果我更改这行代码以排除int
它,它的工作原理相同,但如果我完全取出该行,它就不起作用。这条线在做什么?我唯一能想象的是它创建一个整数并为其分配al_init()
函数的返回值,这可能是-1
失败和0
成功等。但如果这是这样做的,那么你怎么能检查返回价值?
在 C/C++ 中有函数声明和函数定义:
声明如下所示:
int a_function();
void another_function();
double yet_another_function();
解释:
int
, void
)double
描述了函数返回值的类型。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
。根据 C 的语法规则,原型定义为:
<return-type> function-name (param1, param2, ..);
函数调用定义为:
function-name(param1, param2,...);
. 所以它显然定义了一个函数原型而不是调用该函数。
使用上述规则,另一个规则是:对于隐式整数返回类型,假设原型定义在任何可执行函数代码之外。如果它在函数内部,它将被称为函数调用而不是函数原型定义。
除此之外,让我们从问题开始:
在浏览一些快板教程时,我发现了一个奇怪的电话。
int al_init();
那是不正确的,它看起来像一个函数原型或声明
函数 al_init() 初始化 allegro 以便可以使用 allegro 函数。什么是 int al_init(); 线?如果我将这行代码更改为排除 int ,它的工作原理相同,但如果我完全删除该行,它就不起作用。
什么不起作用?停止编译?这很明显,因为它将无法找到al_init()
功能。此外,它在没有“int”的情况下工作的原因是因为它隐含地假定返回一个整数。
这条线在做什么?
它告诉编译器al_init()
库函数是在别处定义的,通常在 a .lib
or .a
or.dll
中,并且您希望在程序中使用它。
我唯一能想象的是它创建了一个整数并为其分配了 al_init() 函数的返回值,
对代码的绝对错误解释,它不会创建任何整数,也不会为其分配任何值。
可能是 -1 表示失败,0 表示成功等。但如果这是这样做的,那么你怎么能检查返回值呢?
由于您想知道该函数返回了什么,您可以在实际调用 al_init() 时执行此操作:
int retval = al_init();
printf("al_init() returned %d",retval);
你确定你不是在看函数声明吗?