c++ - 不用g++编译c代码的主要原因是什么?

标签 c++ c compilation

<分区>

我在一个项目中使用了c,经过一番研究,我发现了一些c++库的更好方法,但我真的不想重写代码(比如,printf to cout).

我做了一些搜索,得到:“它们是两种截然不同的语言”、“不要这样做”等,但我从未找到详细的解释。

为什么?是否有一些推荐的文章可供阅读?

最佳答案

对于您的一般性问题,没有简单 的答案。 C++ 仅支持 C 的一个子集。如果您想用两种语言编写有效的代码并且具有相同的语义,您的能力非常有限。一些不是有效 C++ 的 C 代码示例是:

  • 使用在 C++ 中没有特殊含义的 关键字 的代码,例如 classthisnew 等。为了避免混淆,您通常会尽量避免在 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
}

ma​​in.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/

相关文章:

c - 为什么当我写到数组末尾时我的程序没有崩溃?

c - 将所有 C 代码写在一个源文件中真的会使程序运行得更快吗?

C:从文件输入排序,收到大量编译错误

c++ - 全局变量c/c++之间的冲突

c - Linux 内核 - 如何停止等待信号量的 kthread?

c - fseek 在打开的文件指针上失败

asp.net - 如何从 TeamCity 预编译 ASP.NET Web 应用程序?

c++ - pnacl-ld : Invalid archive member header magic string

c++ - 如何从继承的子类访问基类中的私有(private)成员 (C++)

c++:错误:在'class std::result_of<void (*(std::unordered_map