3
function1()
    {
        statement1;
        statement2;
        function2()
        {
                statement3;
                statement3;
        }
    } 

为什么控制不进入function2,即使两个函数的返回类型相同

4

3 回答 3

11

如果你想进入function2,你必须调用它。将它放在另一个函数中的事实并不意味着它将被执行,而是声明和定义。你必须明确地调用它

function1()
    {
    statement1;
    statement2;
    function2()
    {
            statement3;
            statement3;
    }
 function2();

} 

事实上,标准 C 不允许这样做。但这仍然取决于您的编译器,因此如果您出于某种目的这样做,请检查您的编译器,否则只需将 function2 声明拉出 function1 的块

于 2011-03-15T12:13:20.653 回答
5

这不是标准定义的合法 C。它甚至可以编译吗?

更新:假设 GCC,CoolStraw 的答案是正确的。

于 2011-03-15T12:12:30.890 回答
1

原始问题的答案是 CoolStraw 说定义嵌套函数是不够的,您必须在要执行的点显式调用它。必须在此之前进行贴花。它与它是否与包含函数具有相同的类型无关。

正如 Mat 所说,C 标准不允许在函数内部定义函数。它是 IBM 的 XLC 编译器也支持的 gcc 扩展。

自大约 1970 年的原始 K&R C 以来,函数的结果类型默认为 int,并且是迄今为止所有 C 标准的一部分。这不是伪代码或 gcc 额外的。现在通常不鼓励使用它,因为它隐藏了错误;例如,如果您忘记了“#include”并使用返回指针的字符串函数,它将默认返回一个 int。如果这些类型的大小相同,您将侥幸逃脱,但在具有 32 位整数的 64 位模式下,丢弃指针的上半部分并用下半部分的符号扩展替换它是一个令人讨厌的错误。

许多编译器会给出某种消息警告您已忽略函数的类型,并且许多编译器还会警告您正在调用非 void 函数而不使用结果。两者都是合法的,都可能正是您想要的,但都可能是错误的。大多数编译器还可以警告不符合标准的扩展,如 gcc 的嵌套函数。如果您关心可移植性,请启用类似的警告。

于 2011-08-23T13:13:50.703 回答