簡體   English   中英

C UNIX中的隱式函數聲明

[英]Implicit Declaration of Function in C UNIX

在下面的代碼中,我得到一個警告,即函數getpgid有一個隱式聲明。 我知道它只是一個警告,但它是一個班級,教授希望我們將警告視為錯誤。 所以,請幫忙。

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

#include <unistd.h>

pid_t pid, pgid;

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

手冊頁

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

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

所有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.確保其他人可以重建您的困難,從而診斷它。

通常,准備向不熟悉您的項目的人清楚地解釋問題的行為會導致問題的根源跳出來。

對於此類OS /編譯器相關的錯誤,您應該明確地向我們提供有關您的平台,編譯器和編譯器標志的更多信息。 您的系統具有此功能並將其隱藏給您是不正常的。 您可能缺少一些編譯器標志。

我的手冊說如果沒有必要,應該避免使用getpgid ,並用更簡單的POSIX函數getpgrp(void)替換。 如果這是你的一個選項(你只是為進程本身的id做這個)你應該明確地這樣做。

如果需要其他標頭,請參閱“getpgid”文檔

暫無
暫無

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

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