2016-07-18 15 views
-3
次のプログラムで

、私は機能n()を呼び出すとn()内、main機能で定義されているm()関数を呼び出すしようと試みるが、私は、コンパイル時に、私は下のエラーを取得:main関数の中で関数を定義できないのはなぜですか?

In function `n': 
(.text+0xa): undefined reference to `m' 
error: ld returned 1 exit status 

エラーが発生するのはなぜですか?説明してください。

コードはここにある:

#include <stdio.h> 
void m(); 
void n() 
{ 
    m(); 
} 

void main() 
{ 
    n(); 
    void m() 
    { 
     printf("hi"); 
    } 
} 
+5

'm'はあなたの主な機能の中にあります。それを外に出しなさい! –

+0

私は知っているが、なぜ私はエラーがある? –

+0

"私は知っている" - 明らかにそうではありません。このコードはコンパイルすべきではなく、リンク時にエラーが発生することは少なくなります。 – WhozCraig

答えて

2

mは、mainの内部に定義されています。標準Cでは、許可されていません(別の関数内で関数を定義することはできません)。

一部のコンパイラ(gccなど)では拡張子として使用できます。しかし、その機能はローカルです。すなわち、mmain内にのみ存在し、外部からは見ることができません。同様に、関数内で定義された変数は、その関数に対してローカルであり、外部からは見えません。

void m();の先頭の宣言では、mという(グローバル)関数が存在しますが、存在しません。だからあなたはリンカのエラーを取得します。

5

あなたは、標準Cの別の関数の範囲内で機能を実装することはできませんあなたのメインのうちのm()の実装を移動します。

投稿したコードはまったくコンパイルしないでください。しかし、あなたが得るエラーは、リンカldmの実装を見つけることができないためです。 と宣言されていますが、の実装が存在し、リンクできないため、この関数を使用できます。

また、main関数は、タイプintの値を返します。 voidを使用すると、プログラムは、オペレーティングシステム/シェルが実行が成功したかどうかを判断できない任意の値を返します。

#include <stdio.h> 

void m(); 

void n() { 
    m(); 
} 

int main() { 
    n(); 
    return 0; 
} 

void m() { 
    printf("hi"); 
} 
0

main()方法のm()外部の関数宣言を移動。

関連する問題