有没有什么方法可以访问命令行参数,而不使用 main 的参数?我需要在另一个函数中访问它,但我宁愿不传递它。

我需要一个仅适用于 Mac OS 和带有 GCC 的 Linux 的解决方案。

有帮助吗?

解决方案

我不认为你应该这样做的C运行时将准备的参数,并通过int argc, char **argv它传递到主,不要试图通过黑客攻击它,因为它在很大程度上是不可移植或可能未定义行为操纵行为! !遵守规则,你将拥有便携......没有别的办法做的比它打破它其他...

其他提示

我不知道如何做到这一点在MacOS,但我怀疑,我将在这里描述的伎俩可以移植到MacOS的带着几分交叉阅读。

在linux下可以使用ELF二进制的所谓的“.init_array”部分中,注册一个它获取程序动初始化过程中调用(前主()被调用)函数。此函数具有相同签名的正常main()函数,execept返回“无效的”。 因此,可以使用该功能来记住或过程的argc,argv的[]和EVP []。

下面是一些代码可以使用:

static void my_cool_main(int argc, char* argv[], char* envp[])
{
    // your code goes here
}

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;

PS:此代码也可以放在一个库中,所以它应该适合你的情况。 它甚至,当你的prgram与运行Valgrind的 - 的valgrind没有一个新的进程,而这导致在/ proc /自/ CMDLINE显露最初的valgrind命令行

PPS:请记住,这个非常早期的程序执行许多子系统中尚未完全初始化 - 我想libc的I / O程序,他们似乎工作,但不依赖于它 - 即使gloval变量可能尚未来构造,等...

您可以将它们复制到全局变量,如果你想要的。

在Linux中,您可以打开 /proc/self/cmdline (假如说 /proc 存在)并手动解析(仅当您需要 argc/argv 时才需要 main() - 例如在全局构造函数中 - 否则最好通过全局变量传递它们)。

更多解决方案可以在这里找到: http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

是的,它很粗糙且不可移植,但如果您正在解决实际问题,您可能不会在意。

可以。大多数平台都提供全局变量__argc和__argv。但同样,我支持zneak的评论。

P.S。使用boost :: program_options解析他们。请不要做任何其他方式在C ++中。

有一些原因指针传递到空间已被消耗这么差?你不会得到任何真正节省了消除参数有问题的功能,你可以放鞭炮了一个有趣的显示。围绕主()的有创意的两轮牛车调用堆栈通常踢脚线在不确定的行为结束,或编译器的特定行为的依赖。两者都是坏的分别的功能和便携性。

请记住有问题的论点的指针的至理,他们将要消耗的空间,不管你做什么。它们中的一个索引的方便是作为的sizeof(int)的作为便宜,我看不出有任何理由不使用它。

这听起来像你正在优化,而积极地和过早,或者你被卡住不得不功能添加到您真的不想惹代码。在任一种情况下,以往操作的方式事情会节省时间和麻烦。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top