0

私が行った場合:

void foo() {
    if( .. ) {
      inline int baa(..) { return .. }
    } else {
      inline int baa(..) { return .. }
    }

}

そして呼び出し:関数baa(..)内で私が得る. しかし、プロトタイプ宣言を行うと、エラーは. インライン関数を使用してマクロ関数を置き換えています。fooimplicit declaration of 'baa'inline int baa(int);inline function 'baa' declared but never defined

これを修正する方法は?

より良い編集 :コンパイラが上記のエラーメッセージを主張する理由を誰かが説明できますか?

4

3 に答える 3

4

インライン関数を使用してマクロ関数を置き換えています。

関数内で関数を定義することはできません。関数を宣言することしかできません。それらを宣言すると、その名前がそのスコープで表示されますが、それらの関数はまだどこかで定義する必要があり、別の関数内でそれらを定義できないことがわかっています。そのため、コンパイラは関数が宣言されたが定義されていないと言います。

代わりに、関数をグローバル スコープで宣言するだけです。inline

于 2012-06-14T03:19:14.093 に答える
1

標準の一部ではありませんが、フラグを使用してコンパイルできます-fnested-functions

于 2012-06-14T03:21:59.300 に答える
1

K-ballo の提案は確かに最善のように思えますが、実際には問題を指摘していません。

ブロックで定義されたネストされた関数は、ブロック内でのみ有効です。通常の変数と同じです。句で1 つの関数を定義し、if句で別の関数を定義するelseと、それぞれがその句内で有効になります。if-elseただし、が閉じられた後はどちらも有効ではありません。

変数とまったく同じです:

if (a) {
    int x = 3;
} else {
    int x = 4;
}
// x isn't valid here.
于 2012-06-14T06:32:09.747 に答える