C++ 如何转换C++;以优雅的方式将代码转换成C
可能重复:C++ 如何转换C++;以优雅的方式将代码转换成C,c++,c,header,C++,C,Header,可能重复: 我曾经是一个C++程序员,但现在我需要在C.写一个程序。 e、 g.在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
我曾经是一个C++程序员,但现在我需要在C.写一个程序。 e、 g.在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语言的一个限制,您没有在语言中内置单独的
命名空间。这通常是通过在名称中添加前缀来实现的。对于全局变量,您可以使用extern
存储说明符来声明但不定义它们
标题:
#pragma once
extern int ns_foo;
来源:
#include "header.h"
int ns_foo = 0;
这里是一个简单的从C++到C的转换。这个方法允许堆栈对象,比如你如何使用NS::和。需要注意的是,您还应该有一个release函数,用于清理由结构分配的任何内存
// 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++中C++使用的某些特性的常规方法与大量的手工工作有关:
- 不使用名称空间,而是为
struct
s和函数使用前缀,例如struct ns\u Sum
和void ns\u Sum\u AddThemUp()
- C没有成员函数。因此,与其调用对象上的函数,不如将对象作为第一个参数传递,例如,
void ns\u Sum\u summup(ns\u 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++,但是我意识到这个偏好不是和大家共享的……/P> < P>其他人已经指出了如何使用名字前缀来模拟命名空间。
但在你的问题中似乎还有另一个误解。只有静态
数据成员转换为C中的“全局”变量。对于结构的每个实例,其他“正常”数据成员都是不同的
public
static
成员是全局变量,因此您不能期望它在C中工作得更好。private
静态
成员可以替换为仅在定义函数的.C
文件中声明的静态
变量。唯一的限制是,这些代码对于<代码>内联函数是不可见的,因为它们将用于C++中的<>代码>内联成员函数。
另一件可能需要补充的事情是,当你在做这样一个项目时,你可以试着开始用C来思考。现代C语言中有一些C++中不存在的工具,C和C++的交叉是一种很受限制的语言。这些工具包括,例如:
- 可以用空函数体替换构造函数的指定初始值设定项
- 在表达式中提供临时变量的复合文字
- 指向VLA(可变长度数组)的指针,可以为向量和矩阵函数提供方便的接口
C有可以使用的结构和函数指针。C中的所有函数都是全局函数吗?向所有人公开?@MPvaliantboy:是的。除非您在标题中声明它们并使它们成为静态的
(就像在C++中一样)。另一个讨论提供了许多有用的提示:最优雅的方法是将代码发布到StackOverflow,;)void ns\u Sum\u AddThemUp()
将是void ns\u Sum\u AddThemUp(ns\u Sum*)
,否?@JensGustedt:是的,的确如此。我纠正了这个例子。谢谢现在它有了你的签名,在类型后面加上const
),你的意思是我可以使用一个结构来存储所有的数据成员。让它成为一些函数的参数?我不知道这里关键字static的含义。与C++不一样?@ MPVIIANTBOYBOONES,可以使用Struts存储数据成员。静态函数仅可用于当前C源文件,外部函数(默认值)可用于最终链接二进制文件中的任何C源文件。