繁体   English   中英

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

[英]Is there anything special I need to do to use C code in my C++ program?

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

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

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

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

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

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

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

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

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

#ifdef __cplusplus
extern "C" {
#endif

... C function declarations here ...

#ifdef __cplusplus
}
#endif

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

挑出几个问题:

“在同一个.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 ++习惯用法。

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

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

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

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

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

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

然而,在风格上,C风格的代码被认为是可怕的C ++。 可以在C ++编写的C风格的代码,这一事实应该如果使用且仅当你不能把它写在C ++,开始与-也就是说,如果它的遗留代码。

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

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

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

但是,请考虑以下代码:

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

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

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

确实,你不能在C ++中隐式地从void*出来; 它不会编译,而你会在C中经常看到它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM