4

私はこの答えを読みました: C で関数プロトタイプを宣言する必要がありますか?

私の質問はより具体的です:

access()、、、、、などのシステム コールを使用するプログラムでは、open()すべてのシステム コール関数を宣言する必要がありますか? それがCの仕組みですか?私は以下を得ているので:creat()write()read()

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 関数の正しいヘッダーを見つけるには、POSIX 2008を参照してください。

C99 標準では、すべての関数を使用する前に宣言または定義する必要があります。


独自の機能については、「システム」をエミュレートする必要があります。関数を宣言するヘッダー、それを実装するソース ファイル、および関数を使用するその他のソース ファイルがあります。他のソース ファイルは、ヘッダーを使用して正しい宣言を取得します。実装ファイルにはヘッダーが含まれており、その実装が他のソース ファイルが期待するものと一致していることを確認します。したがって、ヘッダーはすべてをまとめる接着剤です。

于 2012-11-15T19:55:10.647 に答える
3

それぞれを宣言する必要はありません。これらの関数の宣言を含む適切なヘッダー ファイルをインクルードする必要があります。例えば:

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

stdio.hfcntl.h、およびunistd.h(* nix 用にコーディングしていると仮定) は、言及した機能に必要なものです。詳細については、ドキュメント (つまりman lseek) を参照してください。

于 2012-11-15T19:56:57.747 に答える
1

「コア」ライブラリのセットを除いて、ほとんどすべての言語でこれを行う必要があります。Java、C#、Perl などはすべて、 または の形式を持っているimportuse、ビルド構成で参照を作成したり、コア ライブラリの外部のものを参照したりします。C も例外ではありませんが、C には非常に小さい (つまり、存在しない) "コア ライブラリ" があることを除けば、デフォルトではライブラリ ヘッダーはインクルードされません。

#includeあなたが探しているものです。これらの各関数のマニュアル ページを確認すると、どのヘッダーを含める必要があるかがわかります。

于 2012-11-15T19:55:29.407 に答える