簡體   English   中英

為什么gcc報告“隱含的函數聲明'輪''?

[英]Why does gcc report “implicit declaration of function ‘round’”?

我有以下C代碼:

#include <math.h>

int main(int argc, char ** argv)
{
    double mydouble = 100.0;
    double whatever = round(mydouble);

    return (int) whatever;
}

當我編譯它時,我收到警告:

round_test.c: In function ‘main’:
round_test.c:6: warning: implicit declaration of function ‘round’
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’

我對C生銹了,但我認為#include將round()的聲明帶入了范圍。 我已經檢查了我的ANSI標准(C99是我唯一的副本),它確認了math.h標題中存在round()函數。 我在這里錯過了什么?

編輯:編譯器是Ubuntu上的GCC 4.3.2(intrepid,IIRC)。 運行gcc -E給出:

$ gcc -E round_test.c | grep round
# 1 "round_test.c"
# 1 "round_test.c"
# 2 "round_test.c" 2
    double whatever = round(mydouble);

所以這個定義顯然沒有在標題中找到。

我看到你正在使用gcc。

默認情況下,gcc使用類似於C89的標准。 你可能想“強迫”它使用C99標准(它符合的部分)

gcc -std=c99 -pedantic ...

引自GCC手冊

默認情況下,GCC為C語言提供了一些擴展,在極少數情況下會與C標准沖突。 請參閱C語言系列的擴展。 使用上面列出的-std選項將禁用這些與所選C標准版本沖突的擴展。 您也可以使用-std = gnu89(對於具有GNU擴展的C89)或-std = gnu99(對於具有GNU擴展的C99)顯式選擇C語言的擴展版本。 如果沒有給出C語言方言選項,則默認為-std = gnu89; 在C99支持完成后,在將來的某個版本中,這將更改為-std = gnu99。 作為C99標准一部分的某些功能在C89模式下被接受為擴展。

您的gcc安裝,系統標頭或編譯選項必定有問題。

嘗試使用-E進行編譯。 這將顯示預處理器輸出的內容 - 包括包含哪些標頭以及它們中的內容。 在我的Ubuntu Linux系統上,它有大約1000行輸出,包括:

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));

你需要告訴gcc你想要C99,並且想要在libm中鏈接:

gcc -std=c99 -lm round_test.c

您鍵入的代碼使用GCC 4.0.1在MacOS X 10.5.8上完全編譯。 如果使用選項'-Wall -Wextra'進行刺激,它會抱怨未使用的參數argc和argv - 不是材料。

你在機器上<math.h><math.h>嗎?

您是否嘗試過使用'-stc = c99'等選項?

C99就是答案,但完整的故事有點復雜。 我一直在玩這個的原因是我試圖編譯一個為Windows編寫的庫,它有自己的“優化”round()定義。 我收到一個鏈接器錯誤,告訴我該定義與內置程序沖突,所以我刪除了定義(和聲明)。 一旦我這樣做,我開始得到“隱含聲明錯誤”。

似乎默認的編譯模式(沒有-std = c99標志)既不符合C89也不符合C99:如果符合C89,你應該能夠提供round()的自定義定義而不會發生沖突,如果它符合要求C99聲明應該在math.h中。

你需要鏈接數學庫。 所以在編譯時,一定要添加-lm標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM