1

可能重复:
代码从 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中有命名空间吗?谁能帮忙?谢谢你

4

4 回答 4

3

这是从 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
}
于 2012-09-22T20:29:28.877 回答
0

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

标题:

#pragma once

extern int ns_foo;

资源:

#include "header.h"

int ns_foo = 0;
于 2012-09-22T19:58:16.010 回答
0

使用 C++ 在 C++ 中为您提供的某些功能的传统方法与大量手动工作有关:

  • 您可以为structs 和函数使用前缀,而不是使用命名空间,例如struct ns_Sumvoid ns_Sum_AddThemUp().
  • C 没有成员函数。因此,与其在对象上调用函数,不如将对象作为第一个参数传递,例如void ns_Sum_SumThemUp(ns_Sum* object).
  • 制作成员的方式private是只struct在header中声明,在source中定义。这与合适的创建和销毁功能一起使用:

那就是 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++,但我意识到这种偏好并没有与每个人共享......

于 2012-09-22T20:32:24.413 回答
0

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

但是您的问题似乎还有另一个误解。只有static数据成员转换为 C 中的“全局”变量。其他“正常”数据成员对于struct.

public static成员全局变量,因此您不能指望这会更好地工作 int C。private static成员可以替换为仅在定义函数static的文件中声明的变量。.c唯一的限制是这些对于inline函数是不可见的,就像它们对于inlineC++ 中的成员函数一样。

可能应该添加的另一件事是,当你在做这样的项目时,你可以尝试开始用 C 来思考。现代 C 有一些 C++ 中不存在的工具,C 和 C++ 的交集是一种相当受限制的语言。这些工具是,例如:

  • 可以用空函数体替换构造函数的指定初始化程序
  • 在表达式中提供临时变量的复合文字
  • pointers to VLA (variable length arrays) that can provide you with convenient interfaces for vector and matrix functions
于 2012-09-22T20:50:20.080 回答