如何以优雅的方式将C++代码转换为C
How to transform C++ code into C in an elegant way
可能的重复:
代码从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
的每个实例,其他"正常"数据成员是不同的。
public
static
成员是全局变量,因此您不能指望它在C中工作得更好。private
static
成员可以由仅在您定义函数的.c
文件中声明的static
变量代替。唯一的限制是,这些对inline
函数不可见,就像对C++中的inline
成员函数一样。
另一件可能需要补充的事情是,当你做这样的项目时,你可以试着开始用C思考。现代C有一些C++中不存在的工具,C和C++的交集是一种相当受限的语言。此类工具例如:
- 指定的初始化程序,可以用空函数体替换构造函数
- 在表达式中提供临时变量的复合文字
- 指向VLA(可变长度数组)的指针,可以为向量和矩阵函数提供方便的接口
使用C++在C++中提供的某些功能的传统方法需要大量的手工工作:
- 不使用名称空间,而是为
struct
和函数使用前缀,例如struct ns_Sum
和void 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++,但我意识到这种偏好并不是每个人都认同的。。。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值