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

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

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

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

我不知道如何在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例程,它们似乎可以工作,但不依赖它 – 即使可能还没有构建全局变量,等等…

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

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

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

在Linux中,你可以打开/proc/self/cmdline (假设/proc存在)并手动解析(只有 main() 之前需要argc / argv时才需要这个 – 例如在全局构造函数中 – 否则它更好通过全球变量传递它们)。

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

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

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

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

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