목차
1. 편집 과정 :
.c 파일을 이진 파일로 변환하십시오.
C 언어에서 각 .c 파일은 "컴파일 단위"로 간주됩니다. 각 컴파일 단위에 대해 컴파일러는 먼저 .c 및 포함 된 .h를 .o로 변환합니다 (.o는 "오브젝트 파일"입니다. 바이너리 파일이지만 아직 실행할 수 없습니다.)
2 연결 프로세스 :
마지막으로 .o 파일을 함께 병합하십시오.
실제 개발에서 함수의 정의와 호출은 종종 두 개의 서로 다른 .c에 흩어져 있으며 서로 다른 .o로 컴파일 될 것이므로 이러한 .o 파일은 마지막에 병합해야합니다.
연결 과정에서 사용자가 작성한 파일로 컴파일 된 .o를 연결하는 것 외에도 일부 라이브러리 파일 (표준 라이브러리, 타사 라이브러리)을 연결해야합니다. 여기에있는 라이브러리는 동적 라이브러리로 제공 될 수 있습니다. 또는 정적 라이브러리를 제공합니다.
3. 컴파일 링크는 네 부분으로 구성됩니다.
① 전처리 :
수행 된 작업 : 매크로 교체, 헤더 파일 확장, 조건부 컴파일 , 주석 제거, 사전 컴파일 된 명령어 처리.
그러나 #으로 시작하는 모든 것은 다음과 같은 전처리 단계에서 수행됩니다. #define #include #pragma
조건부 컴파일 : ( 예를 들어 일부 코드가 삭제 되는 등 선택적으로 컴파일 하는 것이 편리 하지만이를 방해하는 것은 유감입니다. 조건부 컴파일은 여러 줄 주석으로도 사용할 수 있습니다.)
#if : 매크로에 정의가 있는지 여부와 매크로 값이 참인지 여부에주의하십시오.
#endif
#그밖에
#ifdef : 다음 매크로가 정의되어 있는지 여부에만주의하십시오.
#ifndef : 논리적으로 부정하는 것과 같습니다. #ifdef
위의 작업은 "컴파일"을 제어하는 데 사용되며 프로그램 실행과 관련이 없습니다.
미리 정의 된 기호 :
__FILE__ // 컴파일 용 소스 파일
__LINE__ // 파일의 현재 줄 번호
__DATE__ // 파일이 컴파일 된 날짜
__TIME__ // 파일이 컴파일 된 시간
__STDC__ // 컴파일러가 ANSI C를 따르는 경우 값은 1이고 그렇지 않으면 정의되지 않습니다.
이러한 사전 정의 된 기호는 다음과 같이 언어에 내장되어 있습니다.
printf("file:%s line:%d\n", __FILE__, __LINE__);
② 컴파일
좁은 의미의 컴파일, 특히 .c 소스 코드 파일을 어셈블리 명령어 로 변환하는 것을 의미합니다.
③ 편집
돌려 조립 지침 에 이진 기계 명령어
④ 링크
4. 매크로 정보
① 매크로의 본질
전처리 단계 에서 텍스트 교체 를 수행 합니다 .
② 매크로 사용
1. 매크로를 사용하여 상수 정의
#define SIZE 10
2. 매크로를 사용하여 연산자 이름 바꾸기
#define and && #define or ||
3. 매크로를 사용하여 유형의 별칭을 재정의합니다.
// typedef unsigned int uint; #define uint unsigned int //给unsigned int类型取一个别名 unit //上面两种方式的区别在于使用typedef定义后面需要加封号
4. 매크로를 사용하여 키워드 별칭을 정의 할 수도 있습니다.
// register 表示 "寄存器" // 这个关键字已经废弃了. #define reg register
5. 매크로를 사용하여 코드 조각을 정의 할 수도 있습니다.
#define CHECK(ret) if (ret == 0) { \ printf("执行失败\n"); \ return 1; \ }
6. 매크로는 "컴파일러 스위치"로도 사용할 수 있습니다.
// 可以根据条件让一些代码能编译或者不编译. // 结合条件编译来使用 // _CRT_SECURE_NO_WARNINGS 就是一个编译开关 // 没有这个宏的定义的时候, VS 就会多编译一些对于 scanf 等函数安全检查的逻辑 // 有这个宏定义, 相关的检查代码就不被编译了. // 这段检查的代码在 stdio.h 里头. 所以必须把这个宏定义到 stdio.h 的上方
③ 매크로의 장단점 (기능 대비)
단점 :
Ⅰ. 올바르게 작성하기가 조금 어렵고 확장시 연산자의 우선 순위로 인해 표현식의 연산 결과가 예상과 맞지 않을 수 있습니다.
Ⅱ. 매크로에는 매개 변수에 대한 유형 검사 기능이 없습니다. 함수에는 유형 검사 기능이 있습니다. 실제 매개 변수는 형식 매개 변수의 유형과 일치해야 사용할 수 있지만 매크로는 일치하지 않습니다. 매크로는 "텍스트 교체"만 수행합니다.
Ⅲ. 매크로 디버깅이 어렵다
Ⅳ. 함수만큼 읽을 수 없음
이점:
Ⅰ. 일부 기능이 할 수 없거나하기 어려운 일을 이룰 수 있습니다.
#define CHECK(ret) if(ret==0){\ printf("执行失败\n");\ return 1;\ } int main() { //如果程序执行成功, 就继续往下走 // 如果程序执行失败, 就结束程序 int ret = 0; ret = login(); CHECK(ret); ret = enterRoom(); CHECK(ret); ret = startMatch(); CHECK(ret); ret = acceptGame(); CHECK(ret); }
Ⅱ. 매크로의 실행 효율은 함수보다 약간 높으며 함수 호출은 매개 변수를 전달해야합니다 (실제 매개 변수 복사).
Ⅲ. 매크로는 "일반 프로그래밍"을 어느 정도 실현할 수 있습니다.
예를 들어 다음 코드는 정수 및 부동 소수점 숫자의 추가를 지원할 수 있습니다.
#define ADD(x,y) ((x)+(y))
④ # 및 ## : "고급 매크로 사용"에 속합니다.
# : 매크로 매개 변수를 해당 문자열로 변환
#define PRINT(FORMAT,VALUE)\
printf("the value of "#VALUE" is "FORMAT" \n",VALUE);
int main()
{
PRINT("%d",(i+2));
return 0;
}
//运行结果: the value of (i+2) is 12
//此处#VALUE相当于把(i+2)转成了字符串,变成结果的一部分了.
## : 양쪽의 기호를 하나의 기호로 결합 할 수 있습니다. 매크로 정의가 별도의 텍스트 조각에서 식별자를 만들 수 있습니다.
#define ADD_TO_SUM(num,value)\
sum##num +=value;
int main()
{
int sum1=0;
int sum2=0;
ADD_TO_SUM(1,10);
ADD_TO_SUM(2,20);
}
//上面1和2这个参数被拼接成了变量名,成了sum1,sum2的一个部分