C语言中函数的隐式声明

在下面的代码中,我得到一个警告,说明函数getpgid有一个隐式的声明。 我知道它只是一个警告,但它是一个class级,教授要我们把警告视为错误。 所以,请帮忙。

我已经包含了相应的头文件,所以我不知道什么是错的:

#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.确保其他人可以重新创建您的难度并进行诊断。

通常,准备向不熟悉项目的人员清楚地解释问题的练习会导致问题的根源跳出来。

对于这样的操作系统/编译器相关的错误,您应该明确地向我们提供有关您的平台,编译器和编译器标志的更多信息。 您的系统具有此功能并将其隐藏给您是不正常的。 你可能错过了一些编译器标志。

我的手册说,如果不是必要的话, getpgid是可以避免的,并用简单的POSIX函数getpgrp(void)来代替。 如果这是你的一个选择(你只是为了进程本身的身份而做这个),你应该明确地做到这一点。

如果需要其他头文件,请参阅“getpgid”文档