網站首頁 編程語言 正文
1. 常量宏定義
使用c中的#define 來定義一個常量來表示一年有多少秒
#define SECONDS_PER_YEAR (606024*365)UL
求圓的周長:
#define D? (r + r) //使用D(5) * 3.14 -----> (5 + 5) * 3.14
2. 定義宏函數
在定義宏函數時,最后一個表達式的結果就是宏函數的返回值
格式:
? #define 宏函數名(形參表) ({語句1;語句2;語句3…})
? 形參沒有數據類型,只有參數名
請寫一個“標準”的宏MIN,這個宏輸入兩個參數并返回較大較小值
#include <stdio.h>
#define MIN(A,B) ({A<B?A:B;})
//宏定義分成多行書寫,行尾必須加續行符
#define MAX(A,B) ({int ret;\
if(A<B)\
ret=B;\
else \
ret=A;\
ret;})
int main(int argc, char const *argv[])
{
int min=MIN(100,200);
printf("min value=%d\n",min);
int max=MAX(100,200);
printf("max value=%d\n",max);
return 0;
}
3. 宏定義和#號結合
#可以將宏的參數轉換為一個字符串
#include <stdio.h>
#define NAME "lisi"
#define NAME1(n) n
#define NAME2(n) #n
int main(int argc, char const *argv[])
{
printf("%s\n",NAME); //------>printf("%s\n","lisi");
printf("%s\n",NAME1(lisi)); //------>printf("%s\n",lisi); //error
printf("%s\n",NAME2(lisi)); //------>printf("%s\n","lisi"); //error
return 0;
}
預處理之后的效果:
# 5 "test02.c"
int main(int argc, char const *argv[])
{
printf("%s\n","lisi");
printf("%s\n",lisi);
printf("%s\n","lisi");
return 0;
}
4. 宏定義和兩個#結合
兩個#可以實現字符串的拼接
// 將a和b代表的字符串拼接生成一個新的字符串
#define ?type(a, b) ? ? a##btype(uint, _t) ?----> 預處理階段展開之后的結果 : uint_t
練習:int型、short型、char型的數據比較大小
#include <stdio.h>
#if 0
int max_int(int a,int b){
return a>b?a:b;
}
short max_int(short a,short b){
return a>b?a:b;
}
char max_int(char a,char b){
return a>b?a:b;
}
#endif
//使用宏定義完成函數模板
#define MAX(T) T max_##T (T a,T b){return a>b?a:b;}
//使用宏定義,定義max_int max_short max_char函數
MAX(int)
MAX(short)
MAX(char)
#define max_value(T) max_##T
int main(int argc, char const *argv[])
{
// printf("int max value =%d \n",max_int(10000,300000));
// printf("short max value =%d \n",max_short(100,300));
// printf("char max value =%c \n",max_char('a','b'));
printf("int max value =%d \n",max_value(int)(10000,300000));
printf("short max value =%d \n",max_value(short)(100,300));
printf("char max value =%c \n",max_value(char)('a','b'));
return 0;
}
預處理代碼:
int max_int (int a,int b){return a>b?a:b;}
short max_short (short a,short b){return a>b?a:b;}
char max_char (char a,char b){return a>b?a:b;}
int main(int argc, char const *argv[])
{
printf("int max value =%d \n",max_int(10000,300000));
printf("short max value =%d \n",max_short(100,300));
printf("char max value =%c \n",max_char('a','b'));
return 0;
}
5. 宏定義和do…while()的結合
使用場合:如果在宏定義階段,有多條語句,最后將c語句用do…while()包裹起來
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PRINT() printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\
printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
#define DBUG() do{printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\
printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);}while(0)
int main(int argc, const char *argv[])
{
int a=100,b=200;
#if 0
/*
調試宏:
__FILE__:文件名
__func__:函數名
__LINE__:當前行號
*/
// if(a>b){
// printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
// printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
// }else{
// printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
// printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
// }
if(a>b){
PRINT()
}else{
PRINT()
}
#endif
#if 0
//如果if或者else只有一條語句,可以省略{}
//包括while,for循環語句都一樣
if(a>b)
PRINT()
else
PRINT()
// if和else宏替換后,變成兩句,替換后語法錯誤,解決辦法就是使用宏定義和do....while結合
#endif
// if和else宏替換后,變成兩句,替換后語法錯誤,解決辦法就是使用宏定義和do....while結合
if(a>b)
DBUG();
else
DBUG();
return 0;
}
6. #ifdef…#else…#endif
格式:
#define 宏定義的名字
#ifdef 宏定義的名字
? //如果宏定義被定義了,這段代碼有效
#else
? //如果宏定義沒被定義,這段代碼有效
#endif
7. #ifndef…#else…#endif
格式:
#define 宏定義的名字
#ifndef 宏定義的名字
? //如果宏定義沒被定義了,這段代碼有效
#else
? //如果宏定義被定義,這段代碼有效
#endif
8. #if defined() … #else … #endif
----> 底層代碼使用較多
格式:
#if defined(宏定義的名字)
// 如果宏定義被定義了,則這段代碼有效
#else
// 如果宏定義沒有被定義,則這段代碼有效
#endif
#if !defined(宏定義的名字)
// 如果宏定義沒有被定義,則這段代碼有效
#else
// 如果宏定義被定義了,則這段代碼有效
#endif
// #if defined可以進行邏輯運算
#if defined(宏定義的名字1) || defined(宏定義的名字2)
// 以上兩個宏定義只要有一個定義了,則這段代碼有效
#else
// 以上兩個宏定義都沒有定義,則這段代碼有效
#endif
#if defined(宏定義的名字1) && defined(宏定義的名字2)
// 以上兩個宏定義都被定義了,則這段代碼有效
#else
// 以上兩個宏定義只要有一個沒有定義,則這段代碼有效
#endif
原文鏈接:https://distant-rove.blog.csdn.net/article/details/127545536
相關推薦
- 2022-02-12 redis 快捷啟動 注冊服務,jar包注冊成服務,開機啟動
- 2022-11-10 Flutter?WillPopScope攔截返回事件原理示例詳解_Android
- 2022-04-03 在Python中如何優雅地創建表格的實現_python
- 2023-12-07 mitt 的使用
- 2022-06-11 docker安裝elastic?search和kibana的實現_docker
- 2022-11-02 Python封裝解構以及丟棄變量_python
- 2022-06-25 iOS開發CGContextRef畫圖使用總結_IOS
- 2023-01-09 Spark處理trick總結分析_相關技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支