2012-04-07 161 views
18
gcc (GCC) 4.6.3 
c89 

我正在嘗試使用usleep。不過,我不斷收到以下警告:隱式函數聲明usleep

我已經包括了unistd.h頭文件中的函數usleep的

隱式聲明。

手冊頁提到了這件事。但我不確定我是否理解它:

usleep(): 
    Since glibc 2.12: 
     _BSD_SOURCE || 
      (_XOPEN_SOURCE >= 500 || 
       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && 
      !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) 
    Before glibc 2.12: 
     _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 

但不知道我與上述做什麼?

+7

你錯過了,你複製上面的文字是同一個人頁面發現的建議:'POSIX.1-2001聲明此功能過時;改用nanosleep(2)。 POSIX.1-2008刪除了usleep()的規範。「所以你會發現有一個背後的意圖使得它很難訪問。只是不要在新代碼中使用它。 – 2012-04-07 15:50:12

回答

24

該列表是定義usleep的先決條件。它基本上是一個類似C的表達式,包含#define變量,在包含頭文件之前必須是true。

頭文件本身將只定義usleep裏面是什麼通常是#ifdef報表及開發商一個巨大的鳥巢花時間來告訴你需要做什麼,這樣你就不必花時間想辦法它自己:-)

假設你正在使用glibc 2.12或更高,這意味着你要麼必須:

  • 聲明_BSD_SOURCE;或
  • 聲明三個其他事情的複雜組合,我不會解碼。

也許最簡單的解決方法是簡單地用gc -D _BSD_SOURCE編譯或放:

#define _BSD_SOURCE 

在你的代碼包含頭文件,讓你usleep之前。

您可能想在任何包含之前定義這些,以防各種頭文件之間存在依賴關係。

+1

謝謝你的工作。實際上,我必須在其他任何包含之前聲明_BSD_SOURCE。否則它會一直給我同樣的警告。我的glibc版本glibc-2.14.90-24.fc16.6.x86_64。 – ant2009 2012-04-07 11:24:08

+0

@ ant2009,是的,這很可能是因爲標頭之間可能存在依賴關係。我會將其添加到答案中。 – paxdiablo 2012-04-07 11:25:50

+0

@paxdiablo我的工具鏈抱怨說'_BSD_SOURCE和_SVID_SOURCE'警告,使用_DEFAULT_SOURCE「',所以我假設在某些情況下'_BSD_SOURCE'不能解決問題 – 2016-01-28 13:01:14

17

這可能會起作用:在Linux上用gcc編譯時添加-std=gnu99

例子:

arm-linux-gcc -lpthread -std=gnu99 -o test ArmLinuxDataPipe1.2.1.c 
+0

This!說--std = c99你會得到一個警告。 – teroi 2017-04-04 10:06:18