【问题标题】:Is there a way to parse command line options before main function is called?有没有办法在调用 main 函数之前解析命令行选项?
【发布时间】:2015-10-21 14:25:37
【问题描述】:

当调用 C/C++ 程序时:

./prog --arg=42

命令行参数被转发到主函数

int main (int argc, char* argv[])

可以解析参数的位置(或转发到进行解析的某个库)。

我想知道是否可以在 C 运行时调用 main 函数之前截取参数。 因为我写了一个替换库,所以我不能使用像 my_lib::init(argc, argv) 这样的初始化函数。

我知道__attribute__((constructor)) 是一个函数,因此在调用 main 之前调用它,但是我不知道如何在这样的标记函数中获取命令行参数。

【问题讨论】:

  • 我们说的是哪个编译器?理论上应该可以更换 CRT 的一部分,我在过去的 DOS 时代做过类似的事情,这应该仍然有效。您可能想为您的问题添加正确的标签。也许你应该解释一下为什么你不能把你想要的逻辑放到 main 中并且需要在 main 之前执行它。
  • 哎呀错过了 c++/c 标签。我一定会clang/llvm
  • 你确定你不能简单地将你的代码变成main(),然后在你完成处理后让它调用real_main(argc, argv),并让用户写real_main(),或者编辑该代码,使 int main(int argc, char **argv) 变为 int real_main(int argc, char **argv)?

标签: c++ c command-line clang command-line-arguments


【解决方案1】:

我认为没有标准的方法来拦截调用可执行文件的入口点main()。

但是,您可以调整可执行文件的链接过程,例如,可能使用ld 的--wrap 和-u 选项。在链接过程中还有更多替换符号的选项,请参考您的链接器手册。

【讨论】:

  • 请注意,任何实现这一点的方法都非常依赖于实现。在 Linux/GCC 上可行的东西在 Windows 上不可行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多