对于您的一般问题,没有简单的答案。 C++ 仅支持 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。对于typedefs,这会产生一个奇怪的后果。在 C 中,你可以有
struct foo;
typedef struct bar foo;
这只是一个例子,代码当然是令人困惑的。但它是 C++ 中的invalid 代码,因为在编写 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 代码从来都不是一个好主意。
我在一个项目中使用了c,经过一番研究,我找到了一些c++库更好的方法,但我真的不想重写代码
对于这个问题,还有另一个简单的解决方案。将您的代码分成多个翻译单元。混合 C/C++ 项目完全没有问题,只要 C 和 C++ 源文件不同。
这意味着您使用 C++ 库将所有代码分解为 C++ 文件,并使用 C++ 编译器仅编译该文件。对于该 C++ 模块的公共接口,请使用 extern "C" 声明并使用 #ifdef __cplusplus 保护它们,以对 C 编译器隐藏它们。
如果使用 C++ 的部分在此处称为 module 的翻译单元中,则结构可能如下所示(非常简化):
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
module.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