網站首頁 編程語言 正文
文件包含
文件包含命令行的一般形式為:
#include"文件名" 或 #include<文件名>
值得注意的是,
(1)<>表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的include目錄),而不在當前源文件目錄去查找;
(2) ""則表示首先在當前源文件目錄中查找,若未找到才到包含目錄中去查找。
(3)一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。
(4)一個包含文件中可以包含別的包含文件。
宏定義
C語言程序中廣泛的使用宏定義,采用關鍵字define進行定義,宏只是一種簡單的字符串替換,根據是否帶參數分為無參和帶參。
無參數的宏
#define 宏名 一段符號
其中一段符號表示你需要的用宏名來代替的一段符號,在編譯預處理時,程序中出現的所有你設定的宏名都將被這段符號代替。
樣例:#defineip114514
表示程序中出現的所有ip都將表示114514。
測試:
#include <stdio.h>
#define ip 114514
int main()
{
int a = ip;
printf("%d\n",a);
return 0;
}
結果:
一般我們使用宏定義是為了方便修改和管理代碼。
需要注意的是宏定義不作語法檢查,只有在編譯被宏展開后的源程序才會報錯。
測試1:
#include <stdio.h>
#define ip 1+2 = 3
int main()
{
int a = 0;
printf("%d\n", a);
return 0;
}
結果:
這里沒使用宏,宏沒被展開,宏沒做語法檢查而不報錯。
測試2:
#include <stdio.h>
#define ip 1+2 = 3
int main()
{
int a = ip;
printf("%d\n", a);
return 0;
}
結果:
宏被展開了,直接編譯報錯。
帶參宏定義
#define 宏名(形參表) 字符串
在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。
對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。
樣例:#define MULTIPLY_2(x,y) ((x)*(y))
注意:在這個宏中,x和y作為參數在表達式中,應被括號分隔開。也就是說當宏中有表達式時,其內部參數需被括號獨立,防止程序出錯。
樣例:
#include <stdio.h>
#define a1(x,y) (x*y)
#define a2(x,y) ((x)*(y))
int main()
{
int a = 1;
int b = 2;
int sum1 = a1(a + b, b);//sum1=(a+b*b)
int sum2 = a2(a + b, b);//sum2=((a+b)*b)
printf("%d %d\n", sum1,sum2);
return 0;
}
結果:
條件編譯
一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是條件編譯。
樣例1:
#include <stdio.h>
#define a1(x,y) (x*y)
#define a2(x,y) ((x)*(y))
int main()
{
int a = 1;
int b = 2;
int sum1 = a1(a + b, b);
int sum2 = 0;
#ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值
if (a == 1)
{
sum2 = a2(a + b, b);
}
#else
if (a == 2)
{
int sum2 = a2(a + b, b);
}
#endif
{
printf("%d %d\n", sum1,sum2);
}
return 0;
}
結果:
樣例2:
#include <stdio.h>
#define a1(x,y) (x*y)
//#define a2(x,y) ((x)*(y))
int main()
{
int a = 1;
int b = 2;
int sum1 = a1(a + b, b);
int sum2 = 0;
#ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值
if (a == 1)
{
sum2 = a2(a + b, b);
}
#else
sum2 = sum1;
#endif
{
printf("%d %d\n", sum1,sum2);
}
return 0;
}
結果:
顯而易見的,宏有沒有定義直接影響了程序運行的結果。
ps:c編譯器中,有幾個特殊形式的預定義宏需要我們注意。
__FILE__ 宏所在文件的源文件名
__FUNCTION__宏所在函數名
__LINE__宏所在行的行號
__DATE__ 代碼編譯的日期
__TIME__ 代碼編譯的時間
樣例:
#include <stdio.h>
#define a1(x,y) (x*y)
//#define a2(x,y) ((x)*(y))
int main()
{
int a = 1;
int b = 2;
int sum1 = a1(a + b, b);
int sum2 = 0;
#ifdef a2 //這里只是檢查宏有沒有定義,并不檢查值
if (a == 1)
{
sum2 = a2(a + b, b);
}
#else
sum2 = sum1;
#endif
{
printf("%d %d\n", sum1,sum2);
}
printf("文件名:%s\n", __FILE__);
printf("函數名:%s\n", __FUNCTION__);
printf("行 號:%d\n", __LINE__); //
printf("日 期:%s\n", __DATE__); //
printf("時 間:%s\n", __TIME__); //
return 0;
}
結果:
原文鏈接:https://blog.csdn.net/qq_64109690/article/details/126672310
相關推薦
- 2022-11-20 Go語言操作Excel利器之excelize類庫詳解_Golang
- 2022-10-03 numpy數組疊加的實現示例_python
- 2022-05-15 jquery事件綁定方法介紹_jquery
- 2024-03-07 SpringAOP對獲取Bean的影響理解
- 2022-06-02 Go語言流程控制詳情_Golang
- 2022-06-01 Python?調用?C++?傳遞numpy?數據詳情_python
- 2022-08-12 如何實現python爬蟲爬取視頻時實現實時進度條顯示_python
- 2022-03-22 C++using聲明和using編譯指令_C 語言
- 最近更新
-
- 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同步修改后的遠程分支