2013-11-14 93 views
1

問題提問界面正在標記許多「可能已經有你的答案的問題」,但我試圖做盡職調查來檢查是否有人確切地詢問我在這裏。如果這是重複的,我很抱歉。隱式聲明警告:什麼是內置函數?

假設我有以下不正確的程序:

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

用gcc編譯給出:

 
$ gcc warnings.c 
warnings.c: In function ‘main’: 
warnings.c:6:2: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default] 
/tmp/ccVzjkvX.o: In function `main': 
warnings.c:(.text+0x15): undefined reference to `undefined_function' 
warnings.c:(.text+0x1f): undefined reference to `undeclared_function' 
collect2: ld returned 1 exit status 
$ 

我知道爲什麼這些警告被髮射,以及如何糾正他們 - 這不是我的問題。

從輸出,很顯然,GCC的治療exit()不同其他未定義/未申報功能,因爲它認爲這是一個「內置函數」

對於一個給定的gcc,我怎麼能告訴gcc認爲是「內置函數」的函數列表是什麼? 它恰恰是c標準庫函數或其他東西的列表嗎?

我認爲做nm libc.so,但在我的Ubuntu虛擬機,這似乎glibc的被剝離,所以沒有有用的信息有這方面的:

 
$ nm /lib/x86_64-linux-gnu/libc.so.6 
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols 
$ 

回答

1

名單相當長,而且相當特定於平臺的。 C標準庫中的許多(但並非全部)函數都(有時)被視爲內置函數。但是也有一些與特定處理器指令和其他硬件功能相關的內置函數。他們記錄了從特別here;鏈接各種頁面,看到here,here,here,herehere.

+0

你不應該對競爭性答案投票。 –

+0

@AlecTeal - 爲什麼不? - 甚至有一枚徽章可以完全符合:http://stackoverflow.com/help/badges/805/sportsmanship –

-1

你編譯C,它允許隱式聲明,所以你的「退出」是隱式聲明的。編譯器相信你稍後定義它。

隱式聲明是好的,如果你隱含的退出與通常的行爲(暗示原型是相同的實際原型)它會沒事的。

GCC只能告訴你內置的內容,因爲你知道對於C編譯器,stdlib將會在那裏。這些是它知道存在(內置)告訴你,你暗示錯誤的唯一功能

否則,我可以在我的桌面上定義一個原型的頭文件,當編譯其他地方的東西時,會在那裏得到一個警告。海灣合作委員會將不得不在任何地方進行掃描,這是不可取的......等等,如果你隱式定義某些東西,然後在翻譯單位或實際版本(或另一種隱含的)不同意的情況下,你將只會得到像這樣的隱含警告。

GCC知道的STDLIB =內置的。

附錄

GCC需要你的話是未定義功能的西港島線存在,則使用隱式的聲明的事情,並沒有什麼矛盾的是,所以它很好。它不知道undeclared_function實際應該是什麼樣子,但它知道exit應該是什麼樣子。

然後,正如你所知,鏈接器會拋出一個合適的(當然是這樣),因爲它找不到它們。

+0

這是有用的,但什麼我專門尋找的是功能的確切名單,是它的一些海灣合作委員會或其他工具輸出或文檔 –

+0

@DigitalTrauma整個C標準庫。只需包含每個heaver文件,並讓GCC吐出一個聲明列表。你可以使用一些標誌來編譯它,告訴它不要使用標準庫(比如說如果你正在創建一個內核......)btw。 –

+0

無法解釋的downvote再次!今天運氣不好。 –

0

通過GCC文檔挖多一點之後,我想我找到了一個合理的部分回答這個(though this answer is more complete in its references):

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

「GCC包括內置許多版本功能在標準C庫「(強調我的)。我認爲這是大多數但不是全部標準庫函數是內置的。

文檔繼續適用於各級C標準的若干名單:

「的ISO C90功能abortabsacosasinatan2atancallocceilcoshcosexit ,...「


一個標準的天秤座的例子ry函數不是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] 
相關問題