2010-10-19 73 views
3

在下面的代碼中,我得到一個警告,提示函數getpgid有一個隱式聲明。我知道它只是一個警告,但它對於一個班級,教授希望我們把警告視爲錯誤。所以,請幫助。C語言中函數的隱式聲明

我已經包含了相應的頭文件以及,所以我不知道什麼是錯:

#include <unistd.h> 

pid_t pid, pgid; 

if ((pgid = getpgid(pid)) < 0) { 
     app_error("Failure to get process group ID"); 
} 
+0

這是什麼平臺?而且,是整個樣本還是實際函數中的代碼? – Joe 2010-10-19 02:58:44

+0

http://bugs.php.net/bug.php?id=32045有一些線索 – 2010-10-19 02:59:32

+0

它的代碼在一個實際的函數中,我沒有包含完整的函數,因爲那是導致問題的唯一部分, UNIX。 – DemonicImpact 2010-10-19 03:03:10

回答

4

man page其他一些標題:

對於glibc的

功能測試宏要求(見feature_test_macros(7)):

getpgid(): 
     _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 
     || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L 
+0

這是什麼意思?對不起,我對編程有點新鮮感......好吧。 – DemonicImpact 2010-10-19 03:08:48

+0

您必須定義一些可用於代碼的原型的宏。另請參閱參考手冊頁(feature_test_macros(7))。 – vanza 2010-10-19 03:09:50

+0

這是否意味着我需要在包含語句之前包含以下幾行? 的#define _XOPEN_SOURCE 的#define _XOPEN_SOURCE_EXTENDED – DemonicImpact 2010-10-19 03:16:04

0

參見「getpgid」文檔中,如果有需要

2

最好的猜測與所有的elision:pid_t是未定義的。你需要兩個

#include <sys/types.h> 
#include <unistd.h> 

否則你不明白你的想法。

提供以相同方式失敗的最小源文件會更有幫助。例如,下面的內容(對你的文本的最小精化)不會在你嘗試的第一個系統上產生你描述的警告。

#include <unistd.h> 
#include <stdio.h> 
int main() { 
    pid_t pid, pgid; 
    if((pgid = getpgid(pid)) < 0) { 
      puts("Oops."); 
    } 
    return 0; 
} 

減少到最小失敗案例的原因是很重要的:
1.確保您有充分的隔離問題。通常這一步使得原因顯而易見。它還有助於消除虛假的線索。
2.確保其他人可以重新創建您的難度並進行診斷。

通常,準備向不熟悉項目的人清楚解釋問題的練習會導致問題的根源跳出。

+1

沒有,['unistd.h'](http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html)是保證定義'pid_t',如果不是,他會得到不同的警告。但最小的失敗案例是很好的一般建議。 – 2010-10-19 03:48:10

+0

你說得對。我撇去了The GNU C Library: Process Identification而不是潛入unistd.h。 – 2010-10-19 04:38:18

+0

+1用於演示最小測試用例的外觀。我無法強調這種技術的強大程度,以及嘗試報告錯誤時的重要性。 – RBerteig 2010-10-19 06:48:49

1

對於這種與操作系統/編譯器相關的錯誤,您應該明確地向我們提供有關您的平臺,編譯器和編譯器標誌的更多信息。系統具有此功能並將其隱藏給您是不正常的。你可能錯過了一些編譯器標誌。

我的手冊說getpgid如果不是必要的話就應該避免,並用簡單的POSIX函數getpgrp(void)來代替。如果這是你的一個選擇(你只是爲了流程本身的身份而做這件事),你應該明確地做到這一點。

+0

當我做了最好的答案建議並添加了測試宏時,它停止給我一個錯誤...但是,我想我可能會使用getpgrp。 – DemonicImpact 2010-10-19 06:48:31

+1

@DemonicImpact:當然,所指出的解決方案在某種程度上是解決問題的一種解決方案。 「自然地」你的編譯器應該知道你的系統符合哪個版本的POSIX,並且自己做正確的事情。 – 2010-10-19 07:11:07