不通过main函数获取命令行参数(Win/Linux/Qt)
来源:互联网 发布:网络用词pa是什么意思 编辑:程序博客网 时间:2024/06/05 16:06
很多时候我们需要用到命令行参数,而如果需要命令行的地方不是在main函数中,那么如何获取命令行参数就成了一个问题。如果通过参数传递的方式从main函数获取命令行参数,那么当有需求的函数距离main函数比较远(需要很多层调用)或者代码在main函数之前执行(例如全局对象的构造函数,不是什么好东西但你不能保证不会在工作遇到)时,我们就需要一些不经由main函数直接获取命令行参数的方法来帮助我们解决问题。
PS:个人水平以及时间按所限,代码方面用了不少强转以及qt的东西,总的来说只是提供一个思路和参考,日后有时间或许会加以修改
Windows平台
使用getCommandLineW()函数获取命令行,然后用CommandLineToArgvW()函数解析为wchar_t**格式。这里实际上应该用getCommandLine函数(宏定义,指向宽字符形式[W]和窄字符形式[A]的两个函数,这方面了解较少不多评论)
void getArguments(){ int argc = 0; wchar_t **argvw = ::CommandLineToArgvW(::getCommandLineW(), &argc); // 注意这里是传入argc的引用 char **argv = new char*[argc]; for( int i = 0; i < argc; i++) argv[i] = (char*)(new std::string(QString::fromUtf16((ushort*)argvw[i]).toLocal8Bit().constData()))->c_str(); // 各种类型转换看上去就很糟糕,如果大神们有更好的方法请留言:)}
Linux平台
文件/proc/self/cmdline中的内容即为当前程序的命令行参数
需要注意的是,存储的命令之间并不是空格而是 ‘\0’
QByteArray GetCommandLine(){ QByteArray cmds; QFile file("/proc/self/cmdline"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) cmds = file.readAll(); return cmds;}void getArguments(){ wordexp_t wcmds; // 这里用wordexp来简化处理,记得包含wordexp头文件 wordexp(GetCommandLine().replace('=0', ' ').constData(), &wcmds, 0); int argc = wcmds.we_wordc; char **argc = wcmds.we_wordv;}
Qt
直接用QCoreApplication::arguments()即可,简单不过局限性比较大,必须在调用之前定义QCoreApplication对象才能正常执行(通常用QApplication,但QApplication本身继承自QCoreApplication)
void getArguments(){ QStringList cmds = QCoreApplication::arguments(); int argc = cmds.size(); char **argv = new char*[argc]; for (int i = 0; i < argc; ++i) argv[i] = cmds[i].toStdString().c_str();}
0 0
- 不通过main函数获取命令行参数(Win/Linux/Qt)
- main函数命令行参数
- main函数命令行参数
- Main函数和命令行参数
- main函数传递命令行参数
- main函数与命令行参数
- linux获取命令行参数的函数getopt
- LINUX下main函数获取重定向后的参数
- 带命令行参数的 main 函数详解
- 带命令行参数的 main 函数详解
- 关于Main函数的命令行参数
- 带命令行参数的 main 函数详解
- 带命令行参数的main函数详解
- main函数参数分析 处理命令行选项
- main 函数argc , argv 主命令行参数
- c++ 带命令行参数的main函数
- 带命令行参数的main函数详解
- Java main函数的命令行参数
- C++primer plus第六版课后编程练习答案11.5和11.6
- Xcode7如何添加PCH文件以及解决添加后定义的宏使用不了的问题
- android Textview 使用之一:伸缩效果
- TCP中的RST标志(Reset)详解
- Disruptor使用指南
- 不通过main函数获取命令行参数(Win/Linux/Qt)
- ios:UIAlertView自动消失
- 欢迎使用CSDN-markdown编辑器
- iOS 摇一摇
- 用CSS缩小文章里的图片可以在手机里显示
- 利用log4j显示hibernate打印sql中的参数
- LEADTOOLS OCR技术案例展示
- Unity3D 碰撞检测的条件和相关组件
- Ubuntu下安装CUDA的最简方法