有没有办法访问命令行参数,而不使用main参数?我需要在另一个函数中访问它,我宁愿不传入它。
我需要的解决方案只能在Mac OS和Linux上使用GCC。
答案 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)一样便宜,我认为没有任何理由不使用它。
听起来你正在进行相当积极和过早的优化,或者你不得不在代码中添加你真正不想搞砸的功能。在任何一种情况下,按常规做事都会节省时间和麻烦。