我应该在C中声明系统调用函数吗?

时间:2012-11-15 19:51:46

标签: c linux function declaration system-calls

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

如果是这样,为什么这有意义?我使用其他语言而不必这样做。

3 个答案:

答案 0 :(得分:11)

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

对于您引用的功能,相关标题为:

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

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

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


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

答案 1 :(得分:3)

您本身不必申报每一项。您需要做的是包含包含这些函数声明的正确头文件。例如:

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

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

答案 2 :(得分:1)

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

#include正是您正在寻找的。查看每个功能的手册页,您就会知道需要包含哪些标题。