C语言构建C++中的类
在构建类时,需要借助于define和typedef两个标识符的帮助,先了解下两者的特性:
define和typedef
define
define是C语言中的预处理命令,用于宏定义。它可以分为无参宏定义和带参宏定义。
无参宏定义的一般形式为:#define 宏名 字符串。其中的“#”表示这是一条预处理命令,“define”为宏定义命令,“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串等。
带参宏定义的一般形式为:#define 宏名(参数表) 字符串。它类似于函数,在宏定义时可以指定参数,并在使用时传递参数。
define命令在编译前将程序中所有的宏名替换为对应的字符串,从而进行宏展开。这使得程序员可以使用简单的名称代替复杂的代码片段,提高了代码的可读性和可维护性。同时,define还可以用于条件编译,如#ifdef、#ifndef、#undef等。
举例:
1.无参宏定义:
#define PI 3.14159
#define N 100
其中PI被定义为3.14159,N被定义为100。在程序中使用PI和N时,它们会被替换为对应的值。
2.带参宏定义:
#define SQUARE(x) ((x) * (x))
其中SQUARE被定义为一个带参宏,它接受一个参数x,并将其平方。在程序中使用SQUARE(5)时,它会被替换为((5) * (5))。
在带参宏定义中,宏名和形参表之间不能有空格出现。同时,形式参数不分配内存单元,因此不必作类型定义。而在宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。另外,在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
typedef
typedef是C语言中的一个关键字,用于为已有的数据类型定义一个新的名称(别名)。其主要作用包括:
提高代码的可读性和可维护性:使用typedef可以为复杂的数据类型定义简洁的名称,使代码更加易于理解和维护。
简化复杂数据类型的声明:使用typedef可以简化复杂数据类型的声明,减少出错的可能性。
便于跨平台开发:使用typedef可以定义与平台和编译器无关的数据类型,便于跨平台开发。
下面是一些typedef的常见用法:
1.为基本数据类型定义别名:
typedef int Integer;
typedef float Float;
Integer和Float分别被定义为int和float的别名。
2.为指针类型定义别名:
typedef int* IntPtr;
IntPtr被定义为指向整数的指针类型。
3.为数组类型定义别名:
typedef int IntArray[10];
IntArray被定义为包含10个整数的数组类型。
4.为结构体类型定义别名:
typedef struct {
int x;
int y;
} Point;
Point被定义为包含两个整数成员的结构体类型。
为函数指针类型定义别名:
typedef int (*CompareFunc)(const void*, const void*);
CompareFunc被定义为指向接受两个指针参数并返回整数值的函数的指针类型。
总之,typedef是一个非常实用的C语言关键字,它可以帮助程序员为已有的数据类型定义新的名称,简化复杂数据类型的声明,提高代码的可读性和可维护性。
两者区别
1.定义不同:define定义后面不用加分号,并且它的别名在对象的前面;typedef需要加分号,并且它的别名在对象的后面。
2.原理不同:define是预处理中的宏定义命令,在预处理时进行简单的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错;typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。
3.作用域不同:define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用;typedef有自己的作用域。
定义类
程序设计:使用C语言定义学生类Student
#include <stdio.h>
/*
首先使用带参宏定义将后两行中的Name进行替换
然后使用typedef将struct Name替换为Name来代替
因此在定义数据结构时将后面的 “{};”带上即可
声明类,或者说创建一个数据结构时,可以使用CLASS(Student)
*/
//1.分离式定义
#define CLASS(Name) \
typedef struct Name Name; \
struct Name
CLASS(Student)
{
int a;
int b;
};
//2.另类定义,不建议
typedef struct P P;
struct P
{
char c;
int(*Fun)(int a, int b);
};
int sun(int a, int b)
{
return a + b;
}
int main()
{
Student student;
student.a=0;
student.b=1;
printf("%d******%d\n",student.a,student.b);
P person;
person.c='a';
person.Fun=sun;
printf("person.c=%c, 2+3=%d\n",person.c, person.Fun(2,3));
return 0;
}