注意:我使用g ++版本4.3.4编译我的C ++代码。
到目前为止,每当我想在我的代码中使用C风格的语言元素时,似乎我可以将C语言包含在我的C ++中并与之一起。
我知道C ++ 主要向后兼容C ...所以我想我的问题是这些:
C的哪些部分不能与C ++兼容?
如果我继续天真地将C语句粘贴到我的C ++代码中,专业程序员会嘲笑我吗?
在同一个.cpp文件中使用C和C ++代码的正确方法是什么?
我可以继续使用g ++编译混合代码吗?
对于这个问题,我主要关注的是一个处理单个.cpp文件和单个g ++命令来编译它的解决方案。我此时并不关心链接。
答案 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 + 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现在我已经脱离了头脑,这是一个很好的小参考;我经常使用它。