【问题标题】:C - run function before/after main() ended [duplicate]C - 在 main() 结束之前/之后运行函数 [重复]
【发布时间】:2013-05-05 04:41:46
【问题描述】:

我有一个问题要问你。 我需要确定我是否可以在 main() 函数结束之前或之后使用某些函数。我找不到一些 C 语言的例子。 你能给我一些建议或例子吗?非常感谢。

【问题讨论】:

  • 你在写什么平台?
  • 你不能把代码放在main的末尾吗?我们需要更多信息来提供真正有用的解决方案。另外,您需要 C++ 还是 C,因为在 C++ 中您可以使用构造函数和析构函数。
  • 只需将main() 重命名为例如oldmain() 并在新的main() 中调用oldmain() 和其他需要的功能。

标签: c++ c


【解决方案1】:

如果你使用 GCC,你可以创建construtors/destructor 函数:

constructor 属性使函数在执行进入main() 之前被自动调用。同样,destructor 属性会导致函数在main() 完成或调用exit() 后自动调用。具有这些属性的函数对于初始化在程序执行期间隐式使用的数据很有用。

示例:

void __attribute__ ((constructor)) ctor() { printf("1"); }
void __attribute__ ((destructor))  dtor() { printf("3"); }
int main() { printf("2"); }

输出:

123

【讨论】:

【解决方案2】:

C 中有atexit 函数(C++ 中为std::atexit),它注册了一个要在程序终止时调用的函数。

【讨论】:

    【解决方案3】:

    您可以将atexit() 用于正常程序退出,使用信号处理程序(在 UNIX 中)用于异常退出。

    GCC 也有构造函数和析构函数 function attributes 可以做你想做的事,不过这不是普通的 C 或 C++。

    【讨论】:

      【解决方案4】:

      这个问题有很多解决方案,其中一些已经提供:

      • 静态 CRT 初始化/终止(静态对象析构函数 "钩")
      • 重命名 main 并用真正的 main 包装它
      • 用 atexit() 注册一个钩子

      不清楚您要做什么,甚至不清楚问题是“我可以这样做”还是“这样做是否安全”?你能澄清一下吗?

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 2014-02-17
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多