2012-09-22 34 views
1

可能重复:
Code convert from C++ to C
Converting a C++ class to a C struct (and beyond)如何转换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.因为没有阶级那里。 如果我在头文件中声明数据成员& b,它们将成为全局变量。 我不喜欢全局变量。 C中有名称空间吗? 谁可以帮忙?谢谢

+1

C有你可以使用的结构和函数指针。 – chris

+0

C中的所有函数都是全局函数?向所有人公开? – MPvaliantboy

+1

@MPvaliantboy:是的。除非你在头文件中声明它们并使它们成为'static'(就像在C++中一样)。 – bitmask

回答

2

这里是从C简单的转换++到C.这种方法允许堆叠的物体,例如如何使用纳秒::总和。注意,你还应该有一个释放函数来清理结构分配的内存。

// 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 
} 
+0

你的意思是我可以使用一个结构来存储所有的数据成员。并使其成为某些功能的参数? – MPvaliantboy

+0

这里我不知道关键字static的含义。与C++不一样? – MPvaliantboy

+0

@MPvaliantboy是的,你可以使用结构来存储数据成员。静态函数仅适用于当前C源文件,extern函数(默认值)可用于最终链接二进制文件中的任何C源文件。 –

0

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

部首:

#pragma once 

extern int ns_foo; 

周守军:

#include "header.h" 

int ns_foo = 0; 
0

使用某些功能,其C++让你在C++中的传统方法有大量的手工工作要做:

  • 而不是使用命名空间,你会使用你的struct小号前缀和功能,例如,struct ns_Sumvoid 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++,但我知道这首选项没有与大家分享......

+1

'void ns_Sum_AddThemUp()'将会是'void ns_Sum_AddThemUp(ns_Sum *)',否? –

+0

@JensGustedt:的确如此。我纠正了这个例子。谢谢! –

+0

所以现在它已经确定了你的签名,在类型后面加上'const' :) –

0

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

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

publicstatic成员全局变量,所以你不能指望这个工作更好INT C. privatestatic会员可以通过只你.c文件,在其中您可以在定义函数内声明的变量static被替换。然后,唯一的限制是它们对于inline函数不可见,因为它们将用于C++中的inline成员函数。

另一件可能应该添加的事情是,当你正在做这样的项目时,你可以尝试开始思考C语言。 Modern C有一些C++中不存在的工具,C和C++是相当有限的语言。这样的工具是例如:

  • 指定初始化可与一个空函数体替换构造
  • 复合文字,在表达式
  • 指针到VLA(可变长度数组),其可以提供临时变量你有方便的矢量和矩阵功能接口