【C语言】宏定义的用法总结

#define函数

#define DEBUG(x) ((x)+(x))

如上所示,用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作等或邻近操作符之间不可预料的相互作用。

 


#define替换

1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替换。

2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被它们的值替换。

  替换文本指的是#define DEBUG(x((x)+(x))中的 ((x)+(x))

3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号,如果是,就重复上述的处理过程。

 


宏参数和#define定义可以包含其他#define定义的符号,但是,宏不可以出现递归,也就是不可以自己调用自己。

 


若想要在宏里面写一个大面积的代码,最好用do{...}while(0)把代码括起来,这样写会带来很多方便,比如最后人们写代码习惯加分号,还有可以使在运行时不会出现逻辑上的错误。

#include<stdio.h>
#include<windows.h>
 
#define FUN1 do{printf("xixi\n");\
                printf("haha\n");\
                printf("heihei\n");\
                printf("hehe\n");\
               }while(0)
 
int main()
{
if (0)
FUN1;
else
FUN1;
system("pause");
return 0;
}

像这样就可以,若不用do{...}while(0),if else就无法正常使用。

 


#的用法

我们知道printf()函数具有邻近字符串的连接性。

 给一个宏的参数前面加上一个#,会把参数转换成参数代表的字面值。

#include<stdio.h>
#include<windows.h>
 
#define M 9
#define PRINT(FORMAT, VALUE) \
printf("the value of "#VALUE" is "FORMAT"\n",VALUE)
 
int main()
{
PRINT("%d", M);
system("pause");
return 0;
}


 

## 的用法

##结构则执行一种不同的任务,他可以把它两边的宏符号连接成一个宏符号。作为作用之一,它允许宏定义从分离的文本段创建表示符。

说白了,可以把两个名称通过##连接在一起,构成一个新的宏名称。

#include<stdio.h>
#include<windows.h>
 
#define STR1 "vrey"
#define STR2 "good"
#define STR1STR2 "12345678"
#define CAT(a,b)\
a##b
 
int main()
{
printf("%s\n",CAT(STR1, STR2));
system("pause");
return 0;
}
 



还应该注意宏的命名:宏命名全部都是大写

 


#undef

这个预处理指令用于移除一个指定的宏定义

格式:#undef NAME

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 C 语言宏定义实现的哈希表(类似于 uthash)的示例代码: ```c #include <stdio.h> #include <stdlib.h> /* 定义哈希表结构体 */ #define HASH_TABLE(name, key_type, value_type) \ typedef struct name##_entry { \ key_type key; \ value_type value; \ struct name##_entry *next; \ } name##_entry; \ typedef struct { \ int size; \ name##_entry **table; \ } name /* 初始化哈希表 */ #define HASH_TABLE_INIT(table, size) \ do { \ (table)->size = size; \ (table)->table = calloc(size, sizeof(*(table)->table)); \ } while (0) /* 释放哈希表 */ #define HASH_TABLE_FREE(table) \ do { \ int i; \ for (i = 0; i < (table)->size; i++) { \ name##_entry *entry = (table)->table[i]; \ while (entry) { \ name##_entry *next = entry->next; \ free(entry); \ entry = next; \ } \ } \ free((table)->table); \ } while (0) /* 查找键对应的值 */ #define HASH_TABLE_GET(table, key, default) \ ({ \ int index = (key) % (table)->size; \ name##_entry *entry = (table)->table[index]; \ while (entry) { \ if ((entry)->key == (key)) { \ break; \ } \ entry = entry->next; \ } \ (entry) ? (entry)->value : (default); \ }) /* 设置键对应的值 */ #define HASH_TABLE_SET(table, key, value) \ do { \ int index = (key) % (table)->size; \ name##_entry *entry = (table)->table[index]; \ while (entry) { \ if ((entry)->key == (key)) { \ (entry)->value = (value); \ break; \ } \ entry = entry->next; \ } \ if (!entry) { \ entry = calloc(1, sizeof(*entry)); \ entry->key = (key); \ entry->value = (value); \ entry->next = (table)->table[index]; \ (table)->table[index] = entry; \ } \ } while (0) /* 删除键对应的值 */ #define HASH_TABLE_DEL(table, key) \ do { \ int index = (key) % (table)->size; \ name##_entry *entry = (table)->table[index]; \ name##_entry *prev = NULL; \ while (entry) { \ if ((entry)->key == (key)) { \ if (prev) { \ prev->next = entry->next; \ } else { \ (table)->table[index] = entry->next; \ } \ free(entry); \ break; \ } \ prev = entry; \ entry = entry->next; \ } \ } while (0) /* 示例用法 */ HASH_TABLE(my_hash_table, int, char *); int main() { my_hash_table table; HASH_TABLE_INIT(&table, 10); HASH_TABLE_SET(&table, 1, "one"); HASH_TABLE_SET(&table, 2, "two"); HASH_TABLE_SET(&table, 3, "three"); printf("%s\n", HASH_TABLE_GET(&table, 1, "not found")); printf("%s\n", HASH_TABLE_GET(&table, 2, "not found")); printf("%s\n", HASH_TABLE_GET(&table, 3, "not found")); HASH_TABLE_DEL(&table, 2); printf("%s\n", HASH_TABLE_GET(&table, 1, "not found")); printf("%s\n", HASH_TABLE_GET(&table, 2, "not found")); printf("%s\n", HASH_TABLE_GET(&table, 3, "not found")); HASH_TABLE_FREE(&table); return 0; } ``` 这个示例代码定义了一个名为 `my_hash_table` 的哈希表类型,其中键的类型为 `int`,值的类型为 `char *`。通过使用宏定义来实现,可以方便地在其他代码中使用这个哈希表类型,并调用宏定义中定义的函数来操作哈希表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值