<分区>
我在一个项目中使用了c,经过一番研究,我发现了一些c++库的更好方法,但我真的不想重写代码(比如,printf
to cout
).
我做了一些搜索,得到:“它们是两种截然不同的语言”、“不要这样做”等,但我从未找到详细的解释。
为什么?是否有一些推荐的文章可供阅读?
标签 c++ c compilation
<分区>
我在一个项目中使用了c,经过一番研究,我发现了一些c++库的更好方法,但我真的不想重写代码(比如,printf
to cout
).
我做了一些搜索,得到:“它们是两种截然不同的语言”、“不要这样做”等,但我从未找到详细的解释。
为什么?是否有一些推荐的文章可供阅读?
最佳答案
对于您的一般性问题,没有简单 的答案。 C++ 仅支持 C 的一个子集。如果您想用两种语言编写有效的代码并且具有相同的语义,您的能力非常有限。一些不是有效 C++ 的 C 代码示例是:
使用在 C++ 中没有特殊含义的 关键字 的代码,例如 class
、this
、new
等。为了避免混淆,您通常会尽量避免在 C 中使用这些关键字,但这当然不是必需的。
C 已指定结构和数组初始值设定项,它们在典型的 C 项目中通常是个好主意。你可以这样写
struct foo {int a; char b; short c; };
struct foo x = { .b = 'x', .c = 42 };
这不是有效的 C++。
在 C 中,您必须编写 struct foo
来引用带有 tag foo 的结构,而 C++ 允许只编写 foo
。当涉及到 typedef
时,这会产生一个奇怪的结果。在 C 中,你可以有
struct foo;
typedef struct bar foo;
这只是一个例子,代码当然很困惑。但它是 C++ 中的无效代码,因为在编写 foo
时您指的是什么不清楚。因此,在 C++ 中,与 struct
标签同名的 typedef
必须指的是完全相同的类型。
C 支持灵活的数组成员作为struct
的最后一个元素,如下所示:
struct foo { int x; int a[]; }
a
的大小在您为该结构分配内存时确定(添加 n * sizeof(int)
)。 C++ 中不存在此功能
在 C 中,指针转换几乎总是错误的,而在 C++ 中它们可用于在基类和派生类之间进行转换。因此,C 有一个通用指针 void *
的概念,可以在不强制转换的情况下进行转换。在 C++ 中,与 void *
之间的转换需要像任何其他指针类型一样的转换。
这些只是我马上能想到的例子,可能还有更多。所以,是的,用 C++ 编译器编译 C 代码从来都不是一个好主意。
I used c in a project, and after some study, I found better method with some c++ libraries, but I really don't want to rewrite the code
对于这个问题,还有一个简单的解决方案。将您的代码分成多个翻译单元。混合 C/C++ 项目完全没有问题,只要 C 和 C++ 源文件不同即可。
所以这意味着您在 C++ 文件中使用 C++ 库提取所有代码,并使用 C++ 编译器仅编译该文件。对于该 C++ 模块的公共(public)接口(interface),使用 extern "C"
声明并使用 #ifdef __cplusplus
对其进行保护,以对 C 编译器隐藏它们。
如果使用 C++ 的部分在此处称为 module
的翻译单元中,结构可能看起来像这样(非常简化):
模块.h:
#ifndef MODULE_H
#define MODULE_H
#ifdef __cplusplus
// the C++ compiler will see this causing all declarations in the block to have C linkage,
// the C compiler won't see it (skipped by the preprocessor)
extern "C" {
#endif
int module_foo(int arg);
#ifdef __cplusplus
}
#endif
#endif
模块.cpp:
#include "module.h"
#include <mycpplib> // example
int module_foo(int arg)
{
// some C++ code using your C++ library
}
main.c:
#include "module.h"
int main(void)
{
int x = module_foo(42);
}
你可以像这样构建一个完整的程序:
gcc -c -omain.o main.c
g++ -c -omodule.o module.cpp
# link them together, using the C++ library libmycpplib:
g++ -oprogram main.o module.o -lmycpplib
关于c++ - 不用g++编译c代码的主要原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768042/