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源文件。