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

両方の関数の戻り値の型が同じであるにもかかわらず、コントロールが function2 に入らないのはなぜですか?

4

3 に答える 3

11

function2 に入りたい場合は、それを呼び出す必要があります。別の関数内に配置したという事実は、それが実行されることを意味するのではなく、まだ宣言および定義されていることを意味します。明示的に呼び出す必要があります

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

} 

実際、標準 C ではこれが許可されていません。ただし、それはまだコンパイラに依存するため、何らかの目的でこれを行う場合は、コンパイラに確認してください。それ以外の場合は、function1 のブロックから function2 宣言を引き出すだけです。

于 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 に答える