#include
でどのヘッダーファイルを呼び出して、文字列のサイズを決定するためのintとしてPATH_MAXを使用できるようにしますか?
宣言できるようにしたい:
char *current_path[PATH_MAX];
しかし、そうすると、コンパイラ(LinuxのClang/LLVM)が次のエラーを発行します。
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
私はグーグル検索を試しましたが、それでも運はありませんでした。
#include <limits.h>
は、問題/エラーを修正しません。
PATH_MAXの値がintであることも修正できますか?
linux/limits.h
にあります。#define PATH_MAX 4096 /* # chars in a path name including nul */
#include <linux/limits.h>
char current_path[PATH_MAX];
PATH_MAX
には、 このブログ (paulsm4に感謝)に記載されているいくつかの欠陥があります。
PATH_MAX
が末尾のヌルバイトの有無にかかわらず最大長を定義するかどうかはまだ不明であることに注意してください。異なるオペレーティングシステム上のいずれかです。コンパイル中かどうかを確認できない場合、またはしたくない場合は、PATH_MAX - 1
の人為的な制限を強制する方が安全です。転ばぬ先の杖。 (明らかに、文字列をバッファリングするには少なくともPATH_MAX
バイトのメモリを予約する必要があります。)
これはいい質問です。簡単なCプログラミングを行っているときに、この問題が発生しました。特定のLinux/Unixの/ usr/includeディレクトリに、システムのすべてのヘッダーファイルがあります。
find . -name "*.h" | xargs grep PATH_MAX
PATH_MAXを定義するいくつかのヘッダーが表示されます。また、この値は場所によって異なる方法で定義されていることがわかります。 Ubuntuのリストを次に示します(grepプログラムからいくつかの誤検出ヒットを手動で削除しました)。
./x86_64-linux-gnu/bits/posix1_lim.h:#define _POSIX_PATH_MAX 256
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX 512
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX MAXPATHLEN
./X11/InitialI.h:#define PATH_MAX 1024
./X11/Xos.h:# define PATH_MAX 4096
./X11/Xwindows.h:#if defined(WIN32) && (!defined(PATH_MAX) || PATH_MAX < 1024)
./X11/Xwindows.h:# undef PATH_MAX
./X11/Xwindows.h:# define PATH_MAX 1024
./X11/Xosdefs.h:# ifndef PATH_MAX
./X11/Xosdefs.h:# define PATH_MAX 4096
./X11/Xosdefs.h:# ifndef PATH_MAX
./X11/Xosdefs.h:# define PATH_MAX 1024
./X11/extensions/XKBsrv.h:#define PATH_MAX MAXPATHLEN
./X11/extensions/XKBsrv.h:#define PATH_MAX 1024
./python2.7/osdefs.h:#ifndef PATH_MAX
./python2.7/osdefs.h:#define PATH_MAX MAXPATHLEN
./python2.7/osdefs.h:#if defined(PATH_MAX) && PATH_MAX > 1024
./python2.7/osdefs.h:#define MAXPATHLEN PATH_MAX
./linux/limits.h:#define PATH_MAX 4096 /* # chars in a path name including nul */
./linux/btrfs.h:#define BTRFS_INO_LOOKUP_PATH_MAX 4080
./linux/un.h:#define UNIX_PATH_MAX 108
/linux/limits.hに定義されている最大の番号があるように見えます。このファイルの移植性について心配しています。したがって、安全のために、このマクロを別の名前、たとえばPATHLEN(4080はほとんどの実用的な状況では十分な長さ)で自分で簡単に定義できます。これが大規模なソフトウェアパッケージ用である場合は、制御することもできます。これは私の意見。
ポータブルな方法は次のとおりです。
#define _POSIX_C_SOURCE 1
#include <limits.h>