我试图通过重新设计一个项目的 API 来了解 C 和 C++ 之间的区别,该项目是我在学期中从用 C 语言编写的 DB 类(创建自己的数据库系统)完成的。现在我正在尝试重新设计项目的 API,它也可以用于用 C++ 语言编写的应用程序。
我对 typedef struct
、enum
、float
等感到困惑。
我在 C 中的头文件代码如下所示:
typedef enum { FALSE = 0, TRUE } bool_t;
typedef float real;
...
typedef struct _hf_record_identification {
int pagenum;
int recnum;
} RECID;
在阅读了一些有关它的引用资料后,我得出的结论是,它可以用 C++ 表示为:
enum bool_t {FALSE = 0, TRUE };
float real;
...
struct _hf_record_identification RECID {
int pagenum;
int recnum;
} ;
我的问题是:typedef
in C 和 typedef
之间的主要区别是什么
C++?在 C++ 中使用 typedef
对我来说并不方便。我把它和 C 搞混了。我是否正确地处理了 typedef float real
的情况?
这一行:
typedef float real;
实际上只是一个typedef
,它将real
定义为float
类型的别名。所以如果你写
float real;
它不相同,无论是在 C 中还是在 C++ 中。它只是一个类型为 float
的变量 real
的声明。
struct
和 enum
使事情变得有点复杂,因为它们有所谓的标签来识别它们:
struct foo
{
int x;
};
此处:foo
是结构的标签。在 C++ 中,您可以仅通过编写标签来引用结构(只要标签名称明确),而 C 要求您始终包含 struct
关键字:
struct foo a; // legal in both C and C++
foo b; // legal only in C++
当然,你也可以使用typedef
创建别名类型,以上面的例子为例:
typedef struct foo foo;
现在,第二个声明也是有效的 C,因为 foo
是一个类型名称。
相同的规则以相同的方式应用于枚举
。
请注意,C++ 不会“自动 typedef” struct
或 enum
。它只允许单独使用标签名称来引用这些类型。因此,额外的 typedef
是绝对有效的 C++。
因此,如果您的代码应该同时使用 C 和 C++(您通常只对头文件有此要求),只需像这样声明您的 struct
:
typedef struct foo foo;
struct foo
{
// members
};
或压缩成一个声明:
typedef struct foo
{
// members
} foo;
请注意,C++ 有一个额外的缺陷。考虑以下代码:
struct foo
{
int x;
};
typedef struct foo *foo;
(旁注:typedef
指针是个坏习惯,这里仅用于简单演示)
此代码是有效的 C,但不是有效的 C++。原因是 C++ 需要一个与结构或枚举标记同名的 typedef
来引用完全相同的结构或枚举类型。在 C 中,没有这样的要求。