1. 區分預處理代碼
在C語言程序里,出現的#開頭的代碼段都屬于預處理。
預處理:是在程序編譯階段就執行的代碼段。
比如: 包含頭文件的的代碼
#include
#include
#include
下面列出C語言里常用的預處理代碼段:
指令 | 描述 |
---|---|
#define | 定義宏 |
#include | 包含一個源代碼文件 |
#undef | 取消已定義的宏 |
#ifdef | 如果宏已經定義,則返回真 |
#ifndef | 如果宏沒有定義,則返回真 |
#if | 如果給定條件為真,則編譯下面代碼 #if (a==12)||(11==12) |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 給定條件不為真,當前條件為真,則編譯下面代碼 #if 1==2 #define ABC “123” #elif 2==2 #define ABC “456” #elif 3==3 #define ABC “789” #endif |
#endif | 結束一個 #if……#else 條件編譯塊 |
#error | 當遇到標準錯誤時,輸出錯誤消息 |
#pragma | 使用標準化方法,向編譯器發布特殊的命令到編譯器中 |
2. #define 預處理指令: 宏定義和宏替換
2.1 宏替換基本用法和銜接符號使用示例
#include
//C預處理器只不過是一個文本替換工具而已,它們會指示編譯器在實際編譯之前完成所需的預處理
#define STR_DATA "123456" //宏替換用法
//替換的宏一般都是大寫
//STR_DATA 稱為替換標識符
#define INT_DATA 6666
//帶參宏
#define PRINT_DATA(x) if(x){printf("為真.\n");} \
else {printf("為假.\n");}
int main(int argc,char **argv)
{
printf("%s\n",STR_DATA);
printf("%d\n",INT_DATA);
PRINT_DATA(1);
PRINT_DATA(0);
return 0;
}
2.2 宏替換的高級用法:#(字符串常量替換符號)
#include
//字符串常量替換
#define PRINT_DATA1(a,b) printf(#a"456"#b"\n");
#define PRINT_DATA2(a,b) printf("%s,%s\n",#a,#b);
int main(int argc,char **argv)
{
PRINT_DATA1(123,"789");
PRINT_DATA2(123,"789");
return 0;
}
2.3 宏替換的高級用法:##(數據拼接符號)
#include
//數據拼接符號
#define PRINT_DATA1(a,b) printf("%d\n",a##b);
int main(int argc,char **argv)
{
PRINT_DATA1(1,4);
PRINT_DATA1(100,400);
return 0;
}
#include
//數據拼接符號
#define PRINT_DATA(a) a##a
int main(int argc,char **argv)
{
printf("%d\n",PRINT_DATA(6));
return 0;
}
2.4 宏定義用法
#include
//#define DEF_A
#ifdef DEF_A
#define STR_DATA "123"
#else
#define STR_DATA "456"
#endif
int main(int argc,char **argv)
{
printf("STR_DATA=%s\n",STR_DATA);
return 0;
}
3. #ifndef、#ifdef 語句
#include
#define AA
#ifndef AA
#error "你沒有定義AA標識符"
#endif
#ifdef A1
#define STR_DATA "123"
#elif 12==12
#define STR_DATA "456"
#elif 34==45
#define STR_DATA "789"
#else
#define STR_DATA "ABC"
#endif
int main(int argc,char **argv)
{
printf("%s\n",STR_DATA);
return 0;
}
4. defined 預編譯語句
#if 0
#include
//常規的常量替換
#define A1 "1234"
#define A2 6666
/*帶參宏*/
#define MAX(a,b) ((a)>(b)?(a):(b))
#define A3(a) if(a){printf("為真.\n");} \
else {printf("為假.\n");}
//替換字符串常量 #
#define PRINTF_1(a) printf("%s\n",#a);
#define PRINTF_2(a,b) printf(#a"456"#b"\n"); //"123456789"
//數據拼接符號 ##
#define PRINTF_3(a,b) printf("%d\n",a##b); //1234
int main(int argc,char **argv)
{
printf("%s\n",A1);
printf("%d\n",A2);
printf("MAX=%d\n",MAX(12,77));
A3(1);
PRINTF_1(1234);
PRINTF_2(123,789);
PRINTF_3(12,34);
return 0;
}
#endif
#if 0
#include
/*
#if 0
//為真的時候執行
int data=123;
#else
//為假的時候執行
int data=666;
#endif
*/
#define B1 //定義一個標識符 B1
#undef B1 //取消標識符B1定義
#ifdef B1
//為真的時候執行
int data=123;
#else
//為假的時候執行
int data=666;
#endif
int main(int argc,char *argv[])
{
printf("data=%d\n",data);
return 0;
}
#endif
#include
#define A3
#if !defined(A1) && !defined(A2) && !defined(A3)
#error "沒有定義 A1或者A2或者A3"
#endif
int main(int argc,char *argv[])
{
return 0;
}
5. #include 預編譯語句
#include
#include "./include_file/app.h"
//#include "/mnt/hgfs/linux-share-dir/linux_c/include_file/app.h"
/*
#include 語法: <> 和 ""
#include 告訴編譯器,從系統的目錄下尋找stdio.h 這個文件。
#include "stdio.h" 告訴編譯器,從當前用戶目錄下尋找stdio.h 這個文件,如果找不到再從系統的目錄下尋找。
#include "./include_file/app.h" 告訴編譯器,從./include_file目錄下尋找頭文件
#include "include_file/app.h"
#include "/mnt/hgfs/linux-share-dir/linux_c/include_file/app.h"
*/
int main(int argc,char *argv[])
{
printf("%s\n",A1);
return 0;
}
6. typedef 關鍵字
typedef 給類型取別名。
比如:
#include
void func1(void);
void func2(void);
#if 0
//宏替換
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
#endif
#if 1
//聲明一種新類型
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
//聲明新數據類型: 函數指針類型: 類型名稱 func_p
typedef void (*func_p)(void);
//定義一個存放函數地址的數組
func_p func_addr[10]={func1,func2};
//聲明新數據類型: 類型abc
typedef char abc[10];
#endif
int main(int argc,char **argv)
{
u8 a;
abc a1,a2;
//通過數組調用函數
func_addr[0]();
func_addr[1]();
printf("%d\n",sizeof(a1));
printf("%d\n",sizeof(a2));
return 0;
}
void func1(void)
{
printf("123\n");
}
void func2(void)
{
printf("456\n");
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7575瀏覽量
134008 -
代碼
+關注
關注
30文章
4670瀏覽量
67759 -
預處理
+關注
關注
0文章
32瀏覽量
10454
發布評論請先 登錄
相關推薦
STM32 C語言預處理解析
/1170799353. C語言預處理詳解 https://blog.csdn.net/czc1997/article/details/810794984. #define宏定義的優點
發表于 07-22 09:03
LED流水燈C語言常用預處理命令
LED流水燈C語言常用預處理命令 宏定義#define使用:#define 新名稱 原內容(不加分號)//對同一個內容,宏定義只能定義一次循
發表于 01-19 06:53
C語言的編譯預處理
在將一個C源程序轉換為可執行程序的過程中, 編譯預處理是最初的步驟. 這一步驟是由預處理器(preprocessor)來完成的. 在源流程序被編譯器處理之前,
發表于 09-20 18:17
?47次下載
C語言預處理命令的分類和工作原理詳細說明
C 語言編程過程中,經常會用到如 #include、#define 等指令,這些標識開頭的指令被稱為預處理指令,預處理指令由
發表于 11-25 10:34
?18次下載
C/C++預處理命令的工作原理及分類
摘要:在C/C++語言編程過程中,經常會用到如#include、#define等指令,同時也會涉及到大量的預處理與條件編譯,這樣做的好處可以
C語言#define的應用
在 C/C++ 編程語言中,當程序被編譯時,被發送到編譯器,編譯器將程序轉換為機器語言,然后完成編譯并執行該程序。預處理器也稱為宏
發表于 03-06 11:29
?266次閱讀
評論