c++ 如何多平台获取当前执行文件的实际地址
2022/6/28 1:23:36
本文主要是介绍c++ 如何多平台获取当前执行文件的实际地址,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
# 在使用cpp的很多时候,不像其他语言例如Python Java.这些跨平台语言获取当前执行的文件实际地址(实现工作环境地址)是非常方便的.
. Python获取当前执行文件的实际地址
import os print(os.path.realpath(__file__))
. Java获取当前执行文件的实际工作环境地址
package com.zhilu.resolvespring.util; /** * @author zhilu * @version jdk1.8 * * 当前工作环境的实际地址。 */ public class GetEnvironmentPath { public static void main(String[] args) { String str = System.getProperty("user.dir"); System.out.println("path:" + str); } }
# Cpp 因为不是跨平台语言并且每种主流的操作系统获取当前执行文件的实际地址的头文件和函数不相同。在开发时有获取当前执行文件的实际地址需求往往比较难以coding,对此在这里整理一下。
// // Created by zhilu on 2022/6/26. // /** * @author zhilu * @version -std=c++11 * * 跨平台获取当前执行的文件地址(exec) */ #include <iostream> #if _WIN32 #include <windows.h> #elif __linux__ #include <unistd.h> #elif __APPLE__ #include <mach-o/dyld.h> #endif // 值返回,不将地址进行返回. std::string getCurrentExecFilePath() { char path[512]; unsigned size = 512; char *currentExecFilePath; currentExecFilePath = static_cast<char *>(malloc(sizeof(char))); if (!currentExecFilePath) { std::cout << "malloc failed" << std::endl; return {}; } // 对于Windows操作系统来说 #if _WIN32 // GetModuleFileName()函数在头文件#include <windows.h>下 GetModuleFileName(nullptr, path, size); path[size] = '\0'; currentExecFilePath = path; // 对于Linux操作系统 #elif __linux__ // readlink()函数在头文件<unistd.h>下 int n = readlink("/proc/self/exe", path, size); std::string path_string; path[n] = '\0'; if(n > 0 && n < size){ currentExecFilePath = path; } // 对于Mac os操作系统 #elif __APPLE__ // _NSGetExecutablePath()函数在头文件<mach-o/dyld.h>下 _NSGetExecutablePath(path, &size); path[size] = '\0'; currentExecFilePath = path; #endif return currentExecFilePath; } int main() { std::cout << getCurrentExecFilePath() << std::endl; }
# 以上code在三种平台测试后没有问题。请放心食用。
这篇关于c++ 如何多平台获取当前执行文件的实际地址的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享