전처리 중에 프로그램에 나타나는 모든 "매크로 이름"이 매크로 정의의 문자열로 대체됩니다. 이를 "매크로 대체" 또는 "매크로 확장"이라고 합니다. 매크로 정의는 소스 프로그램의 매크로 정의 명령으로 완료됩니다. 매크로 대체는 전처리기에 의해 자동으로 수행됩니다. 문자열이 표현식인 경우 이를 기능적 매크로 정의라고 부릅니다.
설명을 확장하기 위해 다음 두 줄의 코드를 예로 들어 보겠습니다.
기능적 매크로 정의: #define MAX(a,b) ((a)>(b)?(a):( b))
#define MAX(a,b) ((a)>(b)?(a):(b))
普通函数 :MAX(a,b) { return a>b?a:b;}
MAX(a,b) { return a>b?a:b;}
(1) 기능 매크로에 의해 정의된 매개변수에는 유형이 없습니다. , 전처리기 정식 교체만 담당하고 매개변수 유형 확인을 수행하지 않으므로 매개변수를 전달할 때 각별히 주의하세요. (2) 기능 매크로, 특히 괄호를 정의할 때 형식에 주의하세요. 위 매크로 정의 함수를 #define MAX(a,b) (a>b?a:b)로 작성하고 내부 괄호를 생략하면 매크로 확장 후 연산자 우선순위로 인해 실행 결과가 잘못됩니다. 위 매크로 함수를 정의할 때 바깥쪽 괄호는 생략하고 매크로는 ++MAX(a,b)로 정의합니다. 그러면 매크로 확장은 ++(a)>(b)?(a):(b)가 됩니다. , 작업 우선순위도 잘못되었습니다. (3) 함수 매개변수가 표현식인 경우 일반 함수 호출과 함수형 매크로 정의의 대체 프로세스가 다릅니다. 일반 함수가 호출되면 실제 매개변수 표현식의 값을 먼저 가져온 다음 실제 매개변수 표현식에 부작용이 있는 경우 이러한 부작용은 한 번만 발생합니다. 예를 들어 MAX(++a, ++b), MAX가 일반 함수인 경우 a와 b는 한 번만 증가합니다. 그러나 MAX 기능 매크로가 정의된 경우 k = ((++a)>(++b)?(++a):(++b))로 확장해야 하며 a와 b는 그렇지 않습니다. 반드시 한 번 또는 두 번 증가합니다. 따라서 매개변수가 표현식인 경우 기능 매크로 정의를 바꿀 때 주의해야 합니다. (4) 실제 함수를 호출하는 코드와 기능적 매크로 정의를 호출하는 코드를 컴파일하여 생성된 명령은 다릅니다. MAX가 일반 함수인 경우 함수 본문 return a > b ? a : b를 컴파일하여 명령어를 생성해야 하며, 코드에 나타나는 각 호출도 컴파일하여 명령어와 호출 명령어를 생성해야 합니다. . 그리고 MAX가 기능적 매크로 정의인 경우 매크로 정의 자체를 컴파일하여 명령어를 생성할 필요는 없지만 코드에 나타나는 각 호출에 대해 컴파일하여 생성된 명령어는 몇 가지 간단한 매개변수가 아닌 함수 본문과 동일합니다. 지침을 전달하고 지침을 호출합니다. 따라서 기능 매크로 정의를 사용하여 컴파일하여 생성된 대상 파일은 더 커집니다. 장점: 우선, 함수 호출은 추가 오버헤드를 가져옵니다. 스택 공간을 열고, 반환 주소를 기록하고, 형식 매개변수를 스택에 푸시하고, 함수에서 반환할 때 스택을 해제해야 합니다. 오버헤드는 코드 효율성을 감소시킵니다. 두 부동 소수점 유형의 크기를 비교하려면 특히 부동 소수점 유형에 대한 비교 함수를 작성해야 합니다. 반대로 위의 매크로 정의는 정수, 긴 정수, 단일 부동 소수점에 사용할 수 있습니다. 유형 및 이중 부동 소수점 유형 및 "<" 연산자를 사용하여 값 크기를 비교할 수 있는 기타 유형, 즉 매크로는 유형과 관련이 없습니다. 위 내용은 매크로 정의 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!