プログラムがあるパス名

とある事情で、プログラムを実行したときにカレントディレクトリではなくプログラムがあるディレクトリを取得したいと思って調べてみました。ニュアンスとしては、iniファイルを読み込むようなシチュエーションを思い浮かべると分かりやすいかも。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char **argv){
     char path[256], drive[256], dir[256], file[256], ext[256];
     GetModuleFileName(NULL, path, sizeof(path)/sizeof(char));
     _splitpath(path, drive, dir, file, ext);
     printf("path  = %s\n",path);
     printf("drive = %s\n",drive);
     printf("dir   = %s\n",dir);
     printf("file  = %s\n",file);
     printf("ext   = %s\n",ext);
  
     _makepath(path, drive, dir, file, ".ini");
     printf("path  = %s\n",path);
     return 0;
}
$ ./path.exe
path  = d:\work\pathtest\path.exe
drive = d:
dir   = \work\pathtest\
file  = path
ext   = .exe
path  = d:\work\pathtest\path.ini

MinGWgccだと、argv[0]にフルパスでプログラムへのパスが入るみたい。Cygwingccだと実行したコマンドしか入んないんだけどねー。

ところで、GetModuleFileName()はWindowsAPIなんだけど、UNIX環境ではどうするんだろ?と思ったけど、考えてみればUNIXは/etc以下に決めうちだよな・・・

というか、splitpath/makepathもWindows環境依存な気がしてきた。UNIXのパスにはドライブなんて概念はないもんなあ・・・。軽くgrepしてみた限りでは、splitpathという関数はなさそう。