首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我可以在C中的变量声明中使用函数吗?int f(),i;

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

Stack Overflow用户
提问于 2013-09-27 07:41:54
回答 3查看 397关注 0票数 4

通过了解Unix编程,第1.6章,more01.c示例:

代码语言:javascript
代码运行次数:0
运行
复制
int see_more(), reply;

已尝试一些类似的代码:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-27 07:45:55

这将编译得很好。但你所做的就是声明这个函数。这与在顶层添加(非原型)声明是一样的。

代码语言:javascript
代码运行次数:0
运行
复制
int hey( );
//      ^ empty parens means it's not a prototype

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

代码语言:javascript
代码运行次数:0
运行
复制
#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!
};

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

代码语言:javascript
代码运行次数:0
运行
复制
#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语法检查器对初始化器中的函数调用有同样的限制。

它可能被认为是不好的风格,但不一定不正确的调用一个函数没有一个原型。可以肯定的是,它消除了编译器从类型角度检查调用是否合理的能力。但你要做的就是别搞砸了。

非原型函数将默认为标准调用约定,这意味着所有整数args (char、short、int)都将提升到int,而所有浮动args将提升到double。这些提升也适用于使用#include <stdarg.h> (和我们心爱的printf)的各种函数,所以我认为知道如何调用非原型函数非常有用。

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

票数 4
EN

Stack Overflow用户

发布于 2013-09-27 07:45:33

您只是在那里声明函数,而不是调用它。

如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
  extern int hey(); // there is a function "hey" somewhere

  hey();
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-27 07:45:54

int hey()方法不返回任何值。试着把它变成void hey()

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19045354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档