1

質問をするインターフェースは、多くの「あなたの答えがすでにあるかもしれない質問」にフラグを立てていますが、私がここにいることを正確に尋ねている質問があるかどうかを確認するためにデューデリジェンスを試みました. これが重複している場合は申し訳ありません。

次の間違ったプログラムがあるとします。

extern void undefined_function(void);
int main(int argc, char **argv)
{
    undefined_function();
    undeclared_function();
    終了 (0);
}

gcc でコンパイルすると、次のようになります。

$ gcc warnings.c
warnings.c: 関数 'main' 内:
warnings.c:6:2: 警告: 組み込み関数 'exit' の互換性のない暗黙の宣言 [デフォルトで有効]
/tmp/ccVzjkvX.o: 関数「main」内:
warnings.c:(.text+0x15): 「undefined_function」への未定義参照
warnings.c:(.text+0x1f): 「undeclared_function」への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました
$

これらの警告が表示される理由と、それらを修正する方法は知っています。それは私の質問ではありません。

出力から、gcc が他の未定義/宣言されていない関数とは異なる方法で処理していることは明らかです。これは、exit()それを「組み込み関数」と見なしているためです。

特定の gcc について、gcc が「組み込み関数」と見なす関数のリストをどのように確認できますか? それはまさにC標準ライブラリ関数のリストですか、それとも何か他のものですか?

を検討しnm libc.soましたが、Ubuntu VM では、この glibc が取り除かれているように見えるため、この点に関して有用な情報はありません。

$ nm /lib/x86_64-linux-gnu/libc.so.6
nm: /lib/x86_64-linux-gnu/libc.so.6: シンボルなし
$
4

3 に答える 3

0

gccのドキュメントをもう少し掘り下げた後、これに対する合理的な部分的な答えを見つけたと思います(ただし、この答えはその参照でより完全です):

http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Other-Builtins.html#Other-Builtins

「GCCには、標準Cライブラリの多くの関数の組み込みバージョンが含まれています」 (強調鉱山)。これは、すべてではないがほとんどの標準ライブラリ関数が組み込まれていることを意味します。

ドキュメントには、c 標準のさまざまなレベルに適用されるいくつかのリストが続きます。

「ISO C90 関数abort, abs, acos, asin, atan2, atan, calloc, ceil, ... coshcosexit


gcc 組み込みではない標準ライブラリ関数の例はbsearch(). プログラムにこれへの呼び出しを追加し、なし#include <stdlib.h>でコンパイルすると、次の-Wimplicit-function-declarationようになります。

warnings.c:5:2: warning: implicit declaration of function ‘bsearch’ [-Wimplicit-function-declaration]

一方exit()、私は得る:

warnings.c:8:2: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration]
warnings.c:8:2: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
于 2013-11-14T19:34:38.580 に答える