main
函数的参数由C运行时定义,这也是获取命令行参数的唯一标准/便携方式。不要与系统作对。 :)
如果您只想在程序的其他部分提供对命令行参数的访问,可以使用许多方法来实现自己的API。只需在main
中使用argv/argc
初始化自定义类,从那时起,您就可以忽略它们并使用自己的API。单例模式非常适合这种情况。
举个例子,最流行的C++框架之一Qt就使用了这种机制:
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
std::cout << app.arguments().at(0) << std::endl;
return app.exec();
}
这些参数被应用程序捕获并复制到一个QStringList
中。有关更多详细信息,请参见QCoreApplication :: arguments()。
同样,在Mac上,Cocoa具有一种特殊的函数,它捕获命令行参数并使它们对框架可用:
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
使用NSProcessInfo.arguments属性,应用程序中的参数随时可用。
我注意到在您更新的问题中,您的类直接在其实例中存储了argc/argv
的副本:
int const argc_;
char const** const argv_;
虽然这样做应该是安全的(
argv
指针的生命周期应该在进程的整个生命周期内有效),但这并不符合C++的风格。考虑创建一个字符串向量(
std::vector<std::string>
)作为容器并复制字符串。然后它们甚至可以安全地进行可变操作(如果您想要的话!)
我希望创建一个独立于main()函数的类,这样就不必明确传递argc和argv给使用它们的代码。
目前不清楚为什么从
main
传递这些信息会被视为需要避免的坏事情。这正是大型框架的工作方式。
建议考虑使用单例以确保只有一个
Application
类的实例。参数可以通过
main
传递,但其他代码无需知道或关心它们来自何处。
如果你真的想隐藏
main
的参数传递到你的
Application
构造函数中的事实,你可以使用宏来隐藏它们。
main
函数的参数之外,没有一种便携或标准的方式来获取程序的参数。 - Some programmer dude