【问题标题】:Can I use function in variable declaration in C? int f(), i;我可以在 C 中的变量声明中使用函数吗?整数 f(), 我;
【发布时间】:2013-09-27 07:41:54
【问题描述】:

来自理解 Unix 编程,第 1.6 章,more01.c 示例:

int see_more(), reply;

tried一些类似的代码:

#include <stdio.h>

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

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

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

【问题讨论】:

  • 您是否尝试在您的 include 之后放置一个原型? int hey();
  • 这是不正确的,或者至少是非常不寻常的 C 语法。我不会依赖编译器决定用它做什么。
  • @Tobia 仅仅因为你从未见过它并不意味着 C 标准没有明确定义它的含义。
  • @PascalCuoq 很好,那么它在哪里允许在函数体中声明函数原型并与变量声明混合?
  • @Tobia C99TC3 6.8.2 和 6.7:1 是相关的。如果您想看到有人提供更多详细信息,请提出问题。

标签: c


【解决方案1】:

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

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 语法检查器对初始化程序中的函数调用有同样的限制。


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

非原型函数将默认使用标准调用约定,这意味着所有整数参数(char、short、int)提升为int,所有浮点参数提升为double。这些提升也适用于使用#include &lt;stdarg.h&gt;(以及我们心爱的printf)的可变参数函数,因此我认为了解如何调用非原型函数非常有用。

我有一些“不要搞砸”代码here,它通过函数指针调用非原型函数。这一切都有效并且符合标准(接近我可以想象的),但我不知道如何对可能指向许多刻板模式之一的函数指针进行原型设计。使用可变符号 (...) 是不正确的,因为它不是一回事。只是没有合适的方法对其进行原型设计,因此指针只是声明为void (*fp)();

【讨论】:

  • 原型在哪里? user2822466 似乎是 C 的新手,所以他可能不明白为什么 hey() 永远不会被调用。
【解决方案2】:

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

像这样:

int main()
{
  extern int hey(); // there is a function "hey" somewhere

  hey();
}

【讨论】:

    【解决方案3】:

    int hey() 方法不返回任何值。尝试将其设为void hey()

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2021-03-25
    • 2022-01-09
    • 2015-01-04
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多