【问题标题】:function inside a function函数内的函数
【发布时间】:2011-07-15 18:04:13
【问题描述】:
function1()
    {
        statement1;
        statement2;
        function2()
        {
                statement3;
                statement3;
        }
    } 

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

【问题讨论】:

  • 这甚至不像 C!返回类型在哪里?
  • @Nick - 根据方言,没有返回类型的函数默认为 int... 但由于它是 GCC 额外的,我不会发誓。

标签: c gcc nested-function


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @jon 会编译但控件不会流入内部函数
    • 这是一个GCC extension。 (和伪代码,缺少两个函数的返回类型。)
    • GCC 在没有警告的情况下编译它(在添加main 和创建函数void 等一些常见更改之后)。此外,function2() 可以在 function1 内部调用,就像 CoolStraw 的回答一样。
    • @schnaader: 如果你在标准兼容模式下调用 gcc 会报错:gcc -std=c99 -pedantic 警告:ISO C 禁止嵌套函数
    • 谁在乎 GCC 扩展? OP没有标记问题“GCC绒毛”,所以这个答案是正确的。
    【解决方案3】:

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

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

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

    【讨论】:

    • 我自己在一个答案中收集了最多的信息。乔恩的回答指出了我的更新方向。
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多