可能重复:
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中是否有命名空间? 谁可以帮忙?谢谢
答案 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 ++的交集是一种非常有限的语言。这些工具是,例如: