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

时间:2012-09-22 19:53:03

标签: c++ c header

  

可能重复:
  Code convert from C++ to C
  Converting a C++ class to a C struct (and beyond)

我曾经是一名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中是否有命名空间? 谁可以帮忙?谢谢

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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

部首:

#pragma once

extern int ns_foo;

周守军:

#include "header.h"

int ns_foo = 0;

答案 2 :(得分:0)

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

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

public static成员全局变量,因此您无法期望这更好地在C中工作。private static成员可以由static变量替换,这些变量仅在您定义函数的.c文件中声明。唯一的限制是inline函数不可见这些函数,因为它们适用于C ++中的inline成员函数。

或许应该添加的另一件事是,当你做这样的项目时,你可以尝试在C中思考。 Modern C有一些C ++中不存在的工具,C和C ++的交集是一种非常有限的语言。这些工具是,例如:

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