2011-06-21 19 views
1

irc.freenode.netの## Cのリンクについて話した後、私は学んだいくつかのコンセプトを試してみました。奇妙なリンク状況

私はmain.cの名前の、このファイルを持っている:

int main(void) { 
    func(); 

    return 0; 
} 

そしてtest.cの名前のこのファイル:

#include <stdio.h> 

void func(void) { 
    printf("Hello.\n"); 
} 

何TEST.Hファイルはありません。

$ gcc -c main.c 
$ gcc -c test.c 
$ gcc main.o test.o 
$ ./a.out 
Hello. 
$ 

をし、それが動作します:

私はこれを行います。最初の呼び出しでgccがmain.cファイル内で呼び出された関数func()を知らないと不平を言ってはいけませんか?私はそのプロトタイプや実装にファイルを含めていませんでしたが、gccはオブジェクトコードをコンパイルして正常な実行可能ファイルにすることができます。そこには何があったのですか?

ありがとうございます。

答えて

8

いくつかの警告をオンにすると、問題を痛感しながら認識されます。

> gcc -Wall -c main.c 
main.c: In function ‘main’: 
main.c:2:5: warning: implicit declaration of function ‘func’ 

Cは、デフォルトで不明な機能についてのことを想定しています。良い?おそらくそうではありません。歴史的。

また、gcc -std=c99も警告をスローします。

+0

ありがとう! – jpmelos

+1

常に、-Wallを使用するべきであることを示す優れた方法です。たぶん-Wall -W。おそらく - ぺだれ。 –

2

これはすべての引数の型が一致しているためです(誰も持っていないため)。あなたはそれをgcc -c -Wall test.cと呼んでgccに不平を言うことができます

+0

ありがとうございました! – jpmelos

関連する問題