【问题标题】:Implicit Declaration of Function in C UNIXC UNIX 中函数的隐式声明
【发布时间】:2010-10-19 02:55:35
【问题描述】:

在以下代码中,我收到一条警告,指出函数 getpgid 存在隐式声明。我知道这只是一个警告,但它是针对班级的,教授希望我们将警告视为错误。所以,请帮忙。

我也包含了相应的头文件,所以我不知道出了什么问题:

#include <unistd.h>

pid_t pid, pgid;

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

【问题讨论】:

  • 这个具体是在什么平台上的?而且,这是整个示例,还是您的代码在实际函数中?
  • 它的代码在一个实际的函数中,我没有包含完整的函数,因为这是唯一导致问题的部分并且它在 UNIX 上。
  • 您的教授并不孤单。我们将警告视为构建系统中的错误。我通常是一个习惯的好习惯,特别是如果你不理解这里的警告。

标签: c unix declaration implicit


【解决方案1】:

来自man page

glibc 的功能测试宏要求(请参阅feature_test_macros(7)):

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

【讨论】:

  • 这是什么意思?抱歉,我对编程有点陌生……嗯,有点。
  • 您必须为原型定义一些宏才能用于您的代码。另请参阅参考手册页 (feature_test_macros(7))。
  • 这是否意味着我需要在包含语句之前包含以下行? #define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED
  • @DemonicImpact: #define _XOPEN_SOURCE 500
【解决方案2】:

所有省略的最佳猜测: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 保证会定义 pid_t,如果不是,他会收到不同的警告。但最小的失败案例是很好的一般建议。
  • 你是对的。我浏览了 delorie.com/gnu/docs/glibc/libc_566.html">TheGNU C Library: Process Identification 而不是深入 unistd.h。
  • +1 用于演示最小测试用例的外观。我无法足够强调这种技术的强大功能,以及在尝试报告错误时它的重要性。
【解决方案3】:

对于此类依赖于操作系统/编译器的错误,您应该明确地向我们提供有关您的平台、编译器和编译器标志的更多信息。你的系统有这个功能并且对你隐藏是不正常的。您可能缺少一些编译器标志。

我的手册说,如果没有必要,应避免使用getpgid,并用更简单的 POSIX 函数getpgrp(void) 代替。如果这是您的选择(您只是为进程本身的 id 执行此操作),您应该明确地这样做。

【讨论】:

  • 当我按照最佳答案的建议并添加测试宏时,它停止给我一个错误......但是,我想我可能会改用 getpgrp。
  • @DemonicImpact:当然,所指出的解决方案在某种程度上是规避问题的解决方案。 “自然”你的编译器应该知道你的系统遵循什么版本的 POSIX,并自己做正确的事情。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 2016-08-10
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多