在我的C ++程序中使用C代码需要做些什么特别的事情吗?

时间:2011-08-05 01:06:57

标签: c++ c g++

注意:我使用g ++版本4.3.4编译我的C ++代码。

到目前为止,每当我想在我的代码中使用C风格的语言元素时,似乎我可以将C语言包含在我的C ++中并与之一起。

我知道C ++ 主要向后兼容C ...所以我想我的问题是这些:

C的哪些部分不能与C ++兼容?

如果我继续天真地将C语句粘贴到我的C ++代码中,专业程序员会嘲笑我吗?

在同一个.cpp文件中使用C和C ++代码的正确方法是什么?

我可以继续使用g ++编译混合代码吗?

对于这个问题,我主要关注的是一个处理单个.cpp文件和单个g ++命令来编译它的解决方案。我此时并不关心链接。

6 个答案:

答案 0 :(得分:3)

链接C和C ++代码的一个重要问题是C ++编译器需要知道它正在链接使用C调用约定而不是C ++调用约定的函数。为此,您经常需要将C头文件包装成以下内容:

#ifdef __cplusplus
extern "C" {
#endif

... C function declarations here ...

#ifdef __cplusplus
}
#endif

有关详细信息,请参阅C++ FAQ

答案 1 :(得分:3)

提出几个问题:

“在同一个.cpp文件中使用C和C ++代码的正确方法是什么?” “我可以继续使用g ++来编译我的混合代码吗?”

如果你想在与常规C ++相同的文件中混合C风格的C ++,那就继续吧。您可以信任编译器来解决任何问题 - 它们将是最小的并且不会影响结构。听到它的声音,你对它本身就没有兴趣获得C-linkage,所以即使C-Code在它自己的文件中,也要把它编译为C ++。事实上,这通常是从C迁移到C ++的一种方式。

如果采用这种方法,您的代码就不是真正的混合C / C ++。它是C ++,其中一些代码使用C风格的程序习惯用法。 C ++完全是为了支持这一点。

“如果我继续天真地将C语句粘贴到我的C ++代码中,专业程序员会嘲笑我吗?”

这取决于您使用它的原因以及原因。结构良好的C代码是很好的代码。在特定问题上,有时C + 比C更好。在使用C风格的动态内存管理之前要认真思考。如果你使用原始的malloc()/free()并且弄错了,你应该被嘲笑。

我建议如果你采用这种方法,你可能稍后会花时间回顾并考虑你是否会更好地使用程序C的C ++习惯用法。

答案 2 :(得分:2)

C ++几乎是C的超集。因此,你可以在C中使用的任何功能在C ++中都是有效的(但不是相反)。

人们可能会嘲笑你编写像C一样的东西,但忽略它们。我不认为这是天真的,但这可能会让我天真。我不知道。

没有[真正的]方法在同一个文件中分离C和C ++代码。它只是相互配合,因为当你把它编译成C ++时,它不再是C了。所以“C和C ++一起”并不是考虑它的方式。

C中之间的唯一区别是保持代码编译为我所知道的C ++(除了C ++有更多关键字)是void*的问题。在C中,它们将隐式地转换为任何指针类型,但在C ++中,您必须使用显式转换将它们转换为另一种指针类型。可能还有其他人,但我不知道。

哦,而且,C ++不支持“default int”。我不知道它现在是否仍然有效,但是如果你不使用变量的类型或函数的返回类型,编译器只会使用int。 C ++不这样做。

答案 3 :(得分:2)

大多数优秀的C语言都可以很好地编译C ++。一些额外的指针强制转换和重命名的标识符将成为合法的C ++。

然而,在风格上,C风格的代码被认为是可怕的C ++。当能够在C ++中编写C风格的代码时,应该使用这一事实,当且仅当您无法用C ++编写它时才开始 - 即,如果它是遗留代码。

  如果我继续天真的话,专业程序员会嘲笑我吗?   把C东西粘在我的C ++代码中?

基本上,是的。 C风格的编码在C ++中被称为“可怕的不安全”,刚开始。这种代码只能由那些并不真正知道如何使用C ++的人编写。通过这种方式,我并不是说做一些非常低级的东西,比如二维重复或二进制重新解释,但是像指针转换或手动资源管理这样的东西,让你嘲笑。

答案 4 :(得分:1)

这个问题太宽泛了;你应该把它分成几个。有一种方法可以将C和C ++目标文件链接在一起; C ++向后兼容C,您可以使用C ++编译器来编译C代码。

但是,请考虑以下代码:

int main(void)
{
    int class = 0;
    int private = 1;
    return private-class;
}

它是有效的C代码,如果编译为C ++代码,显然不会在任何C ++编译器上编译。只是一个例子。

答案 5 :(得分:0)

嗯,显而易见的关键区别在于C ++是面向对象的,而C则不是。也就是说,你不应该有任何可怕的显示停止问题用g ++编译C代码,除非你遇到一个漂浮的讨厌的问题。你可以找到很多很好的参考资料,我承认我的答案远非详尽无遗。

你无法在C ++中隐式地从void*强制转换;它不会编译,而你会在C中经常看到它。

在使用它们之前,你还必须在C ++中显式地声明函数,在C中你不一定要这样做。(这样做很好,但不是所有C程序员都这样做。)

http://www.cprogramming.com/tutorial/c-vs-c++.html现在我已经脱离了头脑,这是一个很好的小参考;我经常使用它。