混合 C 和 C++ 代码时, main() 是否需要在 C++ 部分?

Nic*_*ick 6 c c++ linker gcc clang

我有一个 C 程序,需要与 C++ 库 ( ROS )进行交互。通常,通过使用extern "C"和使用 C++ 编译器进行链接的包装器将 C 代码与 C++ 代码连接起来并不太困难,但我从来没有main在 C 部分的地方这样做过。

C ++ FAQ表示这是一件坏事:

以下是一些要点(尽管某些编译器供应商可能不需要所有这些;请查看您的编译器供应商的文档):

  • 编译时必须使用 C++ 编译器main()(例如,用于静态初始化)

但是我看到另一个消息来源说这几天应该没问题

曾经,大多数 C++ 编译器要求该函数main由 C++ 编译器编译。这种要求在今天并不常见,......

为什么main在 C 部分或 C++ 部分很重要?如果我今天尝试使用常见的链接器(主要是 GCC 和 Clang 的)将代码链接到 C 部分中的代码,我会遇到多少麻烦?

Mic*_*Roy 1

解决此问题的一种简单方法是重命名 C main() 并从新的 C++ main() 中调用它

如:

// in ypur current C main module

int my_c_main(int argc, char* argv[]) /* renamed, was main() */
{
   /* ... */
]

// in a c++ module...

int main(int argc, char* argv[])
{
    extern "C" int my_c_main(int argc, char* argv[]);

    // if your c main() requires environment variables passed in envp,
    // You can allocate space for strings and an array here and pass
    // the environment variables you'll need, as the third parameter
    // to my_c_main(), or pass environ, if your system has
    // it defined in unistd.h

    return my_c_main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)