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

Nus*_*dim 3 c c++ types typedef

我试图通过重新设计我在学期中从用C语言编写的DB类(创建自己的数据库系统)中完成的项目的API来理解C和C++之间的区别.现在我正在尝试重新设计项目的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;
Run Code Online (Sandbox Code Playgroud)

在阅读了一些关于它的引用之后,我得出结论,它可以用C++表示,如:

enum bool_t {FALSE = 0, TRUE };
float real;
...
struct _hf_record_identification RECID {
    int pagenum;
    int recnum;
} ;
Run Code Online (Sandbox Code Playgroud)

我的问题是:typedefC和typedefC++ 之间的主要区别是什么?typedef对我来说,在C++中使用起来并不方便.我把它与C混淆了.我是否正确地做了typedef float real案例?

小智 10

这一行:

typedef float real;
Run Code Online (Sandbox Code Playgroud)

实际上只是一个typedef,它定义real为类型的别名float.所以,如果你写

float real;
Run Code Online (Sandbox Code Playgroud)

它是一样的,既不用C也不在C++.它只是一个real带有类型的变量的声明float.


事情变得更加复杂了一点structenum,因为他们所谓的标签来识别它们:

struct foo
{
    int x;
};
Run Code Online (Sandbox Code Playgroud)

这里:foo是struct的标签.在C++中,您可以仅通过编写标记来引用结构(只要标记名称是明确的),而C要求您始终包含struct关键字:

struct foo a; // legal in both C and C++
foo b;        // legal only in C++
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用typedef上面的示例创建别名类型:

typedef struct foo foo;
Run Code Online (Sandbox Code Playgroud)

现在,第二个声明也是有效的C,因为它foo是一个类型名称.

相同的规则适用于enums.

需要注意的是C++确实不是 " 自动的typedef "一个structenum.它只允许通过单独使用标记名称来引用这些类型.所以,另外一个typedef是绝对有效的C++.

因此,如果您的代码应该同时使用C和C++(通常只有头文件的要求),只需声明struct如下:

typedef struct foo foo;
struct foo
{
    // members
};
Run Code Online (Sandbox Code Playgroud)

或者压缩成一个声明:

typedef struct foo
{
    // members
} foo;
Run Code Online (Sandbox Code Playgroud)

请注意,C++还有一个缺陷.请考虑以下代码:

struct foo
{
    int x;
};

typedef struct foo *foo;
Run Code Online (Sandbox Code Playgroud)

(旁注:typedef指针是一个坏习惯,这里仅用于简单演示)

此代码是有效的C,但不是有效的C++.原因是C++需要typedef与struct或enum标记相同的名称来引用完全相同的struct或enum类型.在C中,没有这样的要求.