C 언어-프로그램 컴파일 및 연결과 관련된 지식 포인트 요약

목차

 

1. 편집 과정 :

2 연결 프로세스 :

3. 컴파일 링크는 네 부분으로 구성됩니다.

① 전처리 :

② 컴파일

③ 편집

④ 링크

4. 매크로 정보

① 매크로의 본질

② 매크로 사용

③ 매크로의 장단점 (기능 대비)


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的一个部分

 

추천

출처blog.csdn.net/weixin_43939602/article/details/110312834