编程开发
C/C++
关闭 VS 的符合模式
typedef 与 define
GO
环境安装及修改路径
go 基础
解决go get 下载github项目慢或无法下载的问题
ASCII 码一览表
本文档使用 MrDoc 发布
-
+
首页
typedef 与 define
## define 和 typedef 如何理清逻辑 - typedef 看最后一个空格后的内容,向前只看由逗号隔开的单词。这些是一起命名的。 - define 看第一个空格前的内容,向后只看由逗号隔开的单词。这些是一起命名的。这两句话是我自己总结的,可能有误,先写着吧。 ## typedef - **别名定义:** ```c typedef int 整型; 整型 num = 10; ``` - 这里将 int 类型定义为整型,并且使用整型作为 num 变量的类型。 - **结构体别名:** ```c typedef struct Person { char name[20]; int age; } Person_t; Person_t p; p.age = 25; ``` - 这里通过 typedef 为 struct Person 起了一个新的别名 Person_t,从而可以直接使用 Person_t 作为结构体的类型。 - **指针别名:** ```c typedef int* IntPtr; IntPtr p; int num = 10; p = # ``` - 这里通过 typedef 为 int* 起了一个新的别名 IntPtr,从而可以直接使用 IntPtr 作为指向 int 类型的指针。 - **函数指针别名:** - 用法:typedef 返回类型 (*函数指针类型名)(参数列表); ```c typedef int (*MathFunc)(int, int); MathFunc add = sum; int result = add(5, 3); ``` - 这里通过 typedef 为函数指针 int (*)(int, int)起了一个新的别名 MathFunc,从而可以直接使用 MathFunc 作为函数指针的类型。 - 有关函数指针别名,这里需要细致讲一下:**在 C 语言中,函数指针是指向函数的指针变量。它可以用来存储函数的地址,并且可以通过指针调用相应的函数。函数指针的类型是根据函数的返回类型和参数列表确定的。** 简单来说,就是将指向函数的指针取一个新的名字,就这个意思。 ```c typedef int (*MathFunc)(int, int); int sum(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int main() { MathFunc add = sum; MathFunc sub = subtract; int result1 = add(5, 3); int result2 = sub(5, 3); printf("result1: %d\n", result1); printf("result2: %d\n", result2); return 0; } ``` ## define - 宏定义中的参数化:宏定义可以使用参数,使其更加灵活。例如: ```c #define SQUARE(x) ((x) * (x)) ``` - 这样定义的 SQUARE 宏可以计算一个数的平方,通过传入不同的参数来进行计算。 - 嵌套宏定义:宏定义可以嵌套使用,这样可以进一步扩展宏的功能。例如: ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MAX_OF_THREE(a, b, c) MAX(MAX(a, b), c) ``` - 在这个例子中,我们定义了两个宏,其中 MAX_OF_THREE 宏使用了 MAX 宏来找到三个数中的最大值。 - 条件编译:#define 也经常用于条件编译,比如根据不同的条件定义不同的宏。例如: ```c #ifdef DEBUG #define DEBUG_PRINT(msg) printf("[DEBUG] %s\n", msg) #else #define DEBUG_PRINT(msg) #endif ``` - 这里根据是否定义了 DEBUG 宏来决定是否编译调试打印语句。 ### 三个特殊符号 ```c #define CONNECT(a,b) a##b #define TOCHAR(a)#@a #define TOSTRING(a) #a // a##tb 表示连接 int n = CONNECT(123,456); // 结果 n = 123456 char *str = CONNECT("abcd", "efg" ); // 结果str = "abcdefg" //@#a表示用单引号包括参数 a,返回的是一个字符 char * ch1 = TOCHAR(1); // 结果ch - '1' char * ch2 - TOCHAR(123); // 报错,单引号只用在单个字符里 //#a 表示用双引号包括参数 a,返回一个字符串 char * str1 = TOSTRING(123); // str = "123" ``` ### 宏定义换行 - 和代码换行一个道理嘛 ```c #define SWAP(a,b) do{ \ int t = 0; \ t = a; \ a = b; \ b = t; \ } while(0) ``` ### 使用 #undef 可以撤销宏定义。 ## 参考 - [C语言define高级用法大全][1] [1]: https://blog.csdn.net/qq_41854911/article/details/121196531
别卷了
2024年5月21日 11:06
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码