在下面的代碼中,我得到一個警告,提示函數getpgid有一個隱式聲明。我知道它只是一個警告,但它對於一個班級,教授希望我們把警告視爲錯誤。所以,請幫助。C語言中函數的隱式聲明
我已經包含了相應的頭文件以及,所以我不知道什麼是錯:
#include <unistd.h>
pid_t pid, pgid;
if ((pgid = getpgid(pid)) < 0) {
app_error("Failure to get process group ID");
}
在下面的代碼中,我得到一個警告,提示函數getpgid有一個隱式聲明。我知道它只是一個警告,但它對於一個班級,教授希望我們把警告視爲錯誤。所以,請幫助。C語言中函數的隱式聲明
我已經包含了相應的頭文件以及,所以我不知道什麼是錯:
#include <unistd.h>
pid_t pid, pgid;
if ((pgid = getpgid(pid)) < 0) {
app_error("Failure to get process group ID");
}
從man page其他一些標題:
對於glibc的功能測試宏要求(見
feature_test_macros(7)
):getpgid(): _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
這是什麼意思?對不起,我對編程有點新鮮感......好吧。 – DemonicImpact 2010-10-19 03:08:48
您必須定義一些可用於代碼的原型的宏。另請參閱參考手冊頁(feature_test_macros(7))。 – vanza 2010-10-19 03:09:50
這是否意味着我需要在包含語句之前包含以下幾行? 的#define _XOPEN_SOURCE 的#define _XOPEN_SOURCE_EXTENDED – DemonicImpact 2010-10-19 03:16:04
參見「getpgid」文檔中,如果有需要
最好的猜測與所有的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.確保其他人可以重新創建您的難度並進行診斷。
通常,準備向不熟悉項目的人清楚解釋問題的練習會導致問題的根源跳出。
沒有,['unistd.h'](http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html)是保證定義'pid_t',如果不是,他會得到不同的警告。但最小的失敗案例是很好的一般建議。 – 2010-10-19 03:48:10
你說得對。我撇去了The GNU C Library: Process Identification而不是潛入unistd.h。 – 2010-10-19 04:38:18
+1用於演示最小測試用例的外觀。我無法強調這種技術的強大程度,以及嘗試報告錯誤時的重要性。 – RBerteig 2010-10-19 06:48:49
對於這種與操作系統/編譯器相關的錯誤,您應該明確地向我們提供有關您的平臺,編譯器和編譯器標誌的更多信息。系統具有此功能並將其隱藏給您是不正常的。你可能錯過了一些編譯器標誌。
我的手冊說getpgid
如果不是必要的話就應該避免,並用簡單的POSIX函數getpgrp(void)
來代替。如果這是你的一個選擇(你只是爲了流程本身的身份而做這件事),你應該明確地做到這一點。
當我做了最好的答案建議並添加了測試宏時,它停止給我一個錯誤...但是,我想我可能會使用getpgrp。 – DemonicImpact 2010-10-19 06:48:31
@DemonicImpact:當然,所指出的解決方案在某種程度上是解決問題的一種解決方案。 「自然地」你的編譯器應該知道你的系統符合哪個版本的POSIX,並且自己做正確的事情。 – 2010-10-19 07:11:07
這是什麼平臺?而且,是整個樣本還是實際函數中的代碼? – Joe 2010-10-19 02:58:44
http://bugs.php.net/bug.php?id=32045有一些線索 – 2010-10-19 02:59:32
它的代碼在一個實際的函數中,我沒有包含完整的函數,因爲那是導致問題的唯一部分, UNIX。 – DemonicImpact 2010-10-19 03:03:10