【问题标题】:Should I declare system call functions in C?我应该在 C 中声明系统调用函数吗?
【发布时间】:2012-11-15 19:51:46
【问题描述】:

我读了这个答案: Must declare function prototype in C?

我的问题更具体:

在使用access()open()creat()write()read() 等系统调用的程序中...我必须声明每个系统调用函数吗? C是这样工作的吗?因为我得到以下信息:

hw1.c: In function ‘main’:
hw1.c:50:9: warning: implicit declaration of function ‘access’ [-Wimplicit-function-declaration]
hw1.c:131:9: warning: implicit declaration of function ‘lseek’ [-Wimplicit-function-declaration]
hw1.c: In function ‘writeFile’:
hw1.c:159:17: warning: implicit declaration of function ‘write’ [-Wimplicit-function-declaration]

基本上,C 似乎对我使用的每个系统调用函数都很生气。 我对 C 有点陌生,这对我来说似乎很奇怪,即使我知道我必须声明我编写的函数我认为 C 会知道系统调用函数并且不需要我在代码中显式声明它们。

我需要这样做吗:

int access(const char *pathname, int mode);

如果是这样,那为什么有意义?我使用其他语言,从不需要这样做。

【问题讨论】:

    标签: c linux function declaration system-calls


    【解决方案1】:

    是的,您应该为您进行的每个系统函数调用包含正确的标头。你不自己写声明——你会弄错的。使用标题!

    对于你引用的函数,相关的标题是:

    #include <unistd.h>  /* Many POSIX functions (but not all, by a large margin) */
    #include <fcntl.h>   /* open(), creat() - and fcntl() */
    

    请参阅POSIX 2008 以找到其他 POSIX 函数的正确标头。

    C99 标准要求所有函数在使用前声明或定义。


    对于您自己的功能,您应该模拟“系统”。将有一个声明函数的头文件、实现它的源文件以及使用该函数的其他源文件。其他源文件使用标题来获得正确的声明。实现文件包含头文件以确保其实现与其他源文件所期望的一致。所以标题是将所有内容粘合在一起的粘合剂。

    【讨论】:

    • 谢谢!这解决了一切。所以基本上我需要导入函数及其标题。如果我只导入函数,我会收到警告,并且函数可能会根据它们的签名工作?从现在开始我会听从这个建议
    • 您包含标头来声明函数。标头通常不包含实现。这些函数通常位于编译器与您的应用程序链接的 C 库中,因此您通常只需包含头文件并正确使用该函数即可。有时您会发现需要在程序的链接行中添加一个(或多个)额外的库。
    【解决方案2】:

    您不必声明每一个,就其本身而言。您需要做的是包含包含这些函数声明的正确头文件。例如:

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    

    stdio.hfcntl.hunistd.h(假设您正在为 *nix 编码)是您提到的功能所需的。有关详细信息,请参阅您的文档(即man lseek)。

    【讨论】:

      【解决方案3】:

      除了一组“核心”库之外,几乎所有语言都必须这样做。 Java、C#、Perl 等都有importuse 的形式,或者在构建配置中进行引用,或者......对于核心库之外的东西。 C 没有什么不同,除了它有一个 very 小(即不存在的)“核心库” - 默认情况下不包含任何库头。

      #include 是您正在寻找的。检查每个函数的手册页,您就会知道需要包含哪些标头。

      【讨论】:

      • C 的标准库与 C++、Java、Python、Ruby 相比肯定是有限的……但称它不存在有点远:)
      • 我的意思是默认情况下不包含任何内容。
      • 对于 c 新手用户来说,区别和混淆的原因是,在语言 x 中,我要么根本不能使用函数,要么可以在没有警告的情况下使用它。在 c 中,代码在没有 #include 的情况下工作,我收到警告。就像 C 说我有点明白你的意思,但如果你更清楚,我将不胜感激。
      • @ArthurWulfWhite:比这更糟。根据函数作为参数的内容和返回的内容,没有正确的原型会导致真正的错误。您确实需要通过包含正确的标题来修复所有这些警告。它们不能被忽视。
      • 该行为的部分原因是历史遗留问题。在有 C 标准之前,编写代码的方式有很大不同(例如,没有原型)。在创建标准时,遗留代码必须仍然是可编译的——取缔现有代码会使标准失败。这意味着从标准之前的日子开始,有各种宽松的规则。 C89 编译器的其中一条规则是,如果某个东西看起来像一个函数并且没有以其他方式声明,那么它就是一个返回int 的具有不确定参数列表的函数。 C99 禁止这样做。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2020-09-25
      • 2019-11-12
      • 2021-08-01
      相关资源
      最近更新 更多