c++ - C 和 C++ 类型之间的区别 (typedef)

标签 c++ c types typedef

<分区>

我试图通过重新设计一个项目的 API 来了解 C 和 C++ 之间的区别,该项目是我在学期中从用 C 语言编写的 DB 类(创建自己的数据库系统)完成的。现在我正在尝试重新设计项目的 API,它也可以用于用 C++ 语言编写的应用程序。

我对 typedef structenumfloat 等感到困惑。

我在 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 的声明。


structenum 使事情变得有点复杂,因为它们有所谓的标签来识别它们:

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++ 不会自动 typedefstructenum。它只允许单独使用标签名称来引用这些类型。因此,额外的 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 中,没有这样的要求。

关于c++ - C 和 C++ 类型之间的区别 (typedef),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44754273/

相关文章:

c++ - 如何在 OpenVDB 中对网格进行下采样

c++ - 如何重置 chrono::duration 值?

c - 最好将指向结构的指针传递给 C 中的函数

c++ - 使用 MSVC++ 9 进行 C 编程的建议

types - 为什么 setMapOutputKeyClass 方法在 mapreduce 作业中是必需的

c - 为什么 c 数组声明为变量名而不是类型

c++ - 如何在 Qt Creator 中添加名称以大写字母开头的 c++ 文件?它会自动使它成为小写字母

c++ - boost::thread undefined reference

c - 判断是ipv4还是ipv6数据结构

python - 将对象从解析的 csv 转换为 int Python