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

时间:2013-09-27 07:41:54

标签: c

了解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。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:4)

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

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


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

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

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

答案 1 :(得分:1)

你只是声明那里的功能,而不是叫它。

像这样:

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

  hey();
}

答案 2 :(得分:-1)

int hey()方法不返回任何值。尝试制作void hey()