1、環境 2、編譯 預處理: gcc E main.c o main.i 編譯: gcc S main.i o main.s //同時做語法檢查 彙編: gcc c main.s o main.o 鏈接: gcc main.o o main.exe 3、4996錯誤 4、預處理 4.1 巨集 巨集定義 ...
1、環境
gcc -v //查看環境變數
gcc 同 g++
gcc main.c -o main.exe
gcc main.c //預設生成a.exe
2、編譯
預處理: gcc -E main.c -o main.i
編譯: gcc -S main.i -o main.s //同時做語法檢查
彙編: gcc -c main.s -o main.o
鏈接: gcc main.o -o main.exe
3、4996錯誤
// 主要存在於scanf,strcpy,sprintf等
#pragma warning(disable:4996) //防止4996錯誤
#define _CRT_SECURE_NO_WARNINGS //防止4996錯誤
4、預處理
4.1 巨集
- 巨集定義
說明:
1)巨集名一般用大寫,以便於與變數區別;
2)巨集定義可以是常數、表達式等;
3)巨集定義不作語法檢查,只有在編譯被巨集展開後的源程式才會報錯;
4)巨集定義不是C語言,不在行末加分號;
5)巨集名有效範圍為從定義到本源文件結束;
6)可以用#undef命令終止巨集定義的作用域;
7)在巨集定義中,可以引用已定義的巨集名;
8)用括弧括住每一個參數,並括住巨集的整體定義。
- 巨集常量
- #define PI 3.14
- 特殊巨集定義
__FILE__ 巨集所在文件的源文件名
__LINE__ 巨集所在行的行號
__DATE__ 代碼編譯的日期
__TIME__ 代碼編譯的時間
- 巨集函數
#define MYADD(x,y) ((x)+(y))
/*
1)巨集的名字中不能有空格,但是在替換的字元串中可以有空格。ANSI C允許在參數列表中使用空格;
2)用括弧括住每一個參數,並括住巨集的整體定義。
3)用大寫字母表示巨集的函數名。
4)如果打算巨集代替函數來加快程式運行速度。假如在程式中只使用一次巨集對程式的運行時間沒有太大提高。
*/
4.2 條件編譯
- 一般情況下,源程式中所有的行都參加編譯。但有時希望對部分源程式行只在滿足一定條件時才編譯,即對這部分源程式行指定編譯條件。
- 測試存在
#define 標識符
...
#ifdef 標識符
程式段1
#else
程式段2
#endif
#define DEBUG
#ifdef DEBUG
void func()
{
printf("debug版本調用\n");
}
#else
void func()
{
printf("release版本調用\n");
}
#endif
- 測試不存在
#define 標識符
...
#ifndef 標識符
程式段1
#else
程式段2
#endif
- 根據表達式定義
#if 表達式
程式段1
#else
程式段2
#endif
#if 1
void func()
{
printf("debug1版本調用\n");
}
#else
void func()
{
printf("debug2版本調用\n");
}
#endif