Window/linux获得程序运行目录C++

发布于:2025-07-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

_pgmptr

Windows专属,这是一个字符串,在stdlib.h中:

#ifndef _pgmptr
#ifdef _MSVCRT_
	extern char *_pgmptr;
#else
	extern char ** __MINGW_IMP_SYMBOL(_pgmptr);
#define _pgmptr	(* __MINGW_IMP_SYMBOL(_pgmptr))
#endif
#endif

这个东西虽然是字符串常量,但是当程序的文件名改变时,文件的目录发生变化时,也会随之改变。

样例:

#include <stdio.h>
#include <stdlib.h>
int main(){
	printf("%s\n",_pgmptr);
	return 0;
}

运行:
运行结果

getcwd()

这个函数获取的是当前运行目录,没有文件名,在io.h里

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main(){
	char path[PATH_MAX]; 
	getcwd(path,sizeof(path));
	printf("%s\n",path);
	return 0;
}

运行结果

有一个BUG:

// 程序位置: C:\Users\Administrator\Desktop\未命名1.exe
// 执行: C:\Users\Administrator>C:\Users\Administrator\Desktop\未命名1.exe
//返回C:\Users\Administrator

运行结果

readlink

linux

#include <unistd.h>
#include <linux/limits.h> 
#include <stdio.h>
#include <stdlib.h>
int main() {
    char path[PATH_MAX];
    ssize_t len = readlink("/proc/self/exe", path, sizeof(path)-1);
    if (len != -1) {
        path[len] = '\0';
        printf("%s", path);
    }
    return 0;
}

filesystem(C++17)

高版gcc才能用(QWQ Dev-Cpp用不了,得自己装新版gcc)

#include <filesystem>
#include <string>
#include <windows.h>
std::string get_exec_path() {
	char path[MAX_PATH];
	GetModuleFileName(NULL, path, MAX_PATH);
	return std::filesystem::path(path).string();
}

跨平台:

#include <filesystem>
#include <string>
std::string get_exec_path() {
    #if defined(_WIN32)
    	#include<windows.h>
        char path[MAX_PATH];
        GetModuleFileName(nullptr, path, MAX_PATH);
        return std::filesystem::path(path).string();
    #elif defined(__linux__)
        return std::filesystem::read_symlink("/proc/self/exe");
    #endif
}

GetModuleFileName

windows专属,能用这个用这个

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(){
	char path[MAX_PATH];
	GetModuleFileName(NULL,path,sizeof(path));
	printf("%s\n",path);
	return 0;
}

???
比较坑的:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc,char* argv[]){
	printf("%s\n",argv[0]);
	return 0;
}

没什么用,返回的很多,当个乐子就好。

C:\Users\Administrator\Desktop\未命名1.exe//调用
C:\Users\Administrator\Desktop\未命名1.exe//返回
Desktop\未命名1.exe//调用
Desktop\未命名1.exe//返回
未命名1.exe//调用
未命名1.exe//返回
\\.\C:\Users\Administrator\Desktop\未命名1.exe//调用
\\.\C:\Users\Administrator\Desktop\未命名1.exe//返回
\\?\C:\Users\Administrator\Desktop\未命名1.exe//调用
\\?\C:\Users\Administrator\Desktop\未命名1.exe//返回

网站公告

今日签到

点亮在社区的每一天
去签到