gpt4 book ai didi

我可以在 C 的变量声明中使用函数吗?诠释 f(), 我;

转载 作者:太空狗 更新时间:2023-10-29 15:32:58 25 4
gpt4 key购买 nike

来自 Understanding Unix Programming,第 1.6 章,more01.c 示例:

int see_more(), reply;

tried一些类似的代码:

#include <stdio.h>

int main()
{
int hey(), reply;
return 0;
}

int hey()
{
printf("Hello");
};

日志中没有错误,但控制台上没有 Hello。谁能解释一下?

最佳答案

这将编译得很好。但您所做的只是声明函数。这与在顶层添加(非原型(prototype))声明相同。

int hey( );
// ^ empty parens means it's not a prototype

如果函数是初始化程序的一部分,则可以在声明中调用该函数。

#include <stdio.h>

int main()
{
int reply=hey();
// ^ here the function is called, even though this is a declaration,
// because the value is needed.
return 0;
}
int hey(){
return printf("Hello");
// a function returning `int` ought to `return ` an int!
};

但通常要调用一个函数,您只需将调用放在(非声明)表达式语句中即可。

#include <stdio.h>

int main()
{
int reply; // declaring a variable
int hey(); // declaring a function
(void) hey(); // function call, casting return value to (void)
return 0;
}
int hey(){
return printf("Hello");
};

在一些早期的编译器中有一个限制,即只有最后一个声明可以包含函数调用。 C99(和大多数“现代”编译器)放宽了这一限制,现在可以在初始化程序中使用函数调用而不受惩罚。

IIRC splint语法检查器对初始化器中的函数调用有同样的限制。


它可能被认为是糟糕的风格,但在没有原型(prototype)的情况下调用函数并不一定是错误的。可以肯定的是,它消除了编译器从类型的角度检查调用是否有意义的能力。但您真正需要做的就是不要搞砸

非原型(prototype)函数将默认为标准调用约定,这意味着所有整数参数(char、short、int)都提升为 int所有 float 参数都提升为 double .这些促销事件也适用于使用 #include <stdarg.h> 的可变参数函数(以及我们心爱的 printf ),所以我认为了解如何调用非原型(prototype)函数非常有用。

我有一些“别搞砸了”代码 here通过函数指针调用非原型(prototype)函数。这一切都有效并符合标准(接近我的想象),但我不知道如何为可能指向许多定型模式之一的函数指针制作原型(prototype)。使用可变符号是不正确的 (...) ,因为这不是一回事。只是没有合适的方法来制作它的原型(prototype),所以指针被声明为 void (*fp)(); .

关于我可以在 C 的变量声明中使用函数吗?诠释 f(), 我;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com