4

我读了这个答案: 必须在 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);

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

4

3 回答 3

12

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

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

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

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

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


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

于 2012-11-15T19:55:10.647 回答
3

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

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

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

于 2012-11-15T19:56:57.747 回答
1

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

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

于 2012-11-15T19:55:29.407 回答