访问命令行参数而不在main中使用char ** argv

时间:2010-03-18 16:26:52

标签: c command-line-arguments

有没有办法访问命令行参数,而不使用main参数?我需要在另一个函数中访问它,我宁愿不传入它。

我需要的解决方案只能在Mac OS和Linux上使用GCC。

6 个答案:

答案 0 :(得分:8)

我不知道如何在MacOS上做到这一点,但我怀疑我在这里描述的技巧可以通过一些交叉阅读移植到MacOS。

在linux上,您可以使用ELF二进制文件的所谓“.init_array”部分来注册在程序启动期间调用的函数(在调用main()之前)。此函数与普通的main()函数具有相同的签名,除非返回“void”。 因此,您可以使用此函数来记住或处理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:此代码也可以放在库中,因此它应该适合您的情况。 它甚至有效,当你的prgr与valgrind一起运行时 - valgrind不会分叉一个新的进程,这会导致/ proc / self / cmdline显示原始的valgrind命令行。

PPS:请记住,在这个非常早期的程序执行期间,许多子系统尚未完全初始化 - 我尝试了libc I / O例程,它们似乎可以工作,但不依赖它 - 即使是全局变量也可能还没有建造等...

答案 1 :(得分:3)

我不认为你应该这样做,因为C运行时会准备参数并通过int argc, char **argv将其传递给主,不要试图通过破解它来操纵行为,因为它很大程度上是不可移植的或可能是未定义的行为!!坚持规则,你将拥有便携性......除了破坏它之外别无他法。

答案 2 :(得分:3)

如果需要,可以将它们复制到全局变量中。

答案 3 :(得分:2)

在Linux中,您可以打开/proc/self/cmdline(假设存在/proc)并手动解析(只有在 {{1}之前需要argc / argv 时才需要这样做例如在全局构造函数中 - 否则最好通过全局变量传递它们。)

此处提供了更多解决方案:http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

是的,它是粗暴且不可移植的,但如果你正在解决实际问题,你可能不在乎。

答案 4 :(得分:0)

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

P.S。使用boost :: program_options来解析它们。请不要在C ++中以任何其他方式执行此操作。

答案 5 :(得分:0)

是否有一些理由将指针传递给已经消耗的空间是如此糟糕?消除相关功能的参数,你不会得到任何真正的节省,你可以设置一个有趣的烟花显示。使用创造性hackery围绕main()的调用堆栈,通常会导致未定义的行为,或者依赖于编译器特定的行为。两者分别对功能和可移植性都不利。

请记住,有争议的参数是参数的指针,无论你做什么,它们都会消耗空间。它们的索引的便利性和sizeof(int)一样便宜,我认为没有任何理由不使用它。

听起来你正在进行相当积极和过早的优化,或者你不得不在代码中添加你真正不想搞砸的功能。在任何一种情况下,按常规做事都会节省时间和麻烦。