如何以优雅的方式将C++代码转换为C

How to transform C++ code into C in an elegant way

本文关键字:代码 C++ 转换 方式      更新时间:2023-10-16

可能的重复:
代码从C++转换为C
将C++类转换为C结构(及以上)

我曾经是一名C++程序员,但现在我需要用C编写程序。例如在C++中

Main.cpp
=====================
int main
{
ns::Sum sum(1, 2);
}
Sum.h
=====================
namespace ns
{
class Sum
{
public:
Sum(int a, int b);
private:
void AddThemUp();
int a;
int b;
}
}
Sum.cpp
======================
namespace ns
{
Sum::Sum(int a, int b)
{
this->a = a;
this->b = b;
AddThemUp();
}
void Sum::AddThemUp()
{
a + b;//stupid for returning nothing, just for instance
}
}

那是C++我不知道如何把上面的内容写在C里,因为那里没有课。如果我声明数据成员a&b,它们将成为全局变量。我不喜欢全局变量。C中有命名空间吗?谁能帮忙?谢谢

这里有一个从C++到C的简单转换。这个方法允许堆栈对象,比如如何使用ns::Sum。需要注意的是,您还应该有一个释放函数,用于清理结构分配的任何内存。

// Main.c
// =====================
// Construction
ns_Sum sum;
ns_SumInitWithAAndB(&sum, 1, 2);
// Sum.h
// =====================
// All member variables are contained within a struct
typedef struct ns_Sum_
{
int a;
int b;
} ns_Sum;
// Public Methods
void ns_SumInitWithAAndB(ns_Sum *sum, int a, int b);
// Sum.c
// ======================
// Private Methods can be declared as static functions within the .c file
static void ns_SumAddThemUp(ns_Sum *sum);
void ns_SumInitWithAAndB(ns_Sum *sum, int a, int b)
{
sum->a = a;
sum->b = b;
ns_SumAddThemUp(sum);
}
void ns_SumAddThemUp(ns_Sum *sum)
{
a + b; //stupid for returning nothing, just for instance
}

不,这是C的限制之一,您没有在语言中内置单独的namespace。这通常是通过在名称中添加前缀来完成的。对于全局变量,可以使用extern存储说明符来声明但不能定义它们。

标题:

#pragma once
extern int ns_foo;

来源:

#include "header.h"
int ns_foo = 0;

其他人已经指出了如何使用名称前缀来模拟命名空间。

但你的问题似乎还有另一个误解。在C中,只有static数据成员转换为"全局"变量。对于struct的每个实例,其他"正常"数据成员是不同的。

publicstatic成员全局变量,因此您不能指望它在C中工作得更好。privatestatic成员可以由仅在您定义函数的.c文件中声明的static变量代替。唯一的限制是,这些对inline函数不可见,就像对C++中的inline成员函数一样。

另一件可能需要补充的事情是,当你做这样的项目时,你可以试着开始用C思考。现代C有一些C++中不存在的工具,C和C++的交集是一种相当受限的语言。此类工具例如:

  • 指定的初始化程序,可以用空函数体替换构造函数
  • 在表达式中提供临时变量的复合文字
  • 指向VLA(可变长度数组)的指针,可以为向量和矩阵函数提供方便的接口

使用C++在C++中提供的某些功能的传统方法需要大量的手工工作:

  • 不使用名称空间,而是为struct和函数使用前缀,例如struct ns_Sumvoid ns_Sum_AddThemUp()
  • C没有成员函数。因此,与其在对象上调用函数,不如将对象作为第一个参数传递,例如void ns_Sum_SumThemUp(ns_Sum* object)
  • 使成员成为private的方法是只在头中声明struct,并在源中定义它。这与适当的创建和销毁功能相结合:

这就是C头中的声明可能看起来像这样:

typedef struct ns_Sum ns_Sum;
ns_Sum* ns_Sum_Create();
void    ns_Sum_Destroy(ns_Sum*);
void    ns_Sum_AddThemUp(ns_Sum const*);

对于简单的结构,使用这样的映射效果相当好。在中,它成为了一种皇家的痛苦。一些身体部位也在这里来实现多态调度或处理道德上等效的模板。我个人对在C中使用C++的看法是使用C++,但我意识到这种偏好并不是每个人都认同的。。。