"함수... 매크로로도 정의할 수 있습니다"를 어떻게 설명할 수 있나요?

"함수... 매크로로도 정의할 수 있습니다"를 어떻게 설명할 수 있나요?

공개 기록을 위해 사람들이 더 쉽게 접근할 수 있도록 표준화된 메일링 리스트가 아닌 SE에 요청합니다.

함수(또는 함수형 인터페이스)를 지정하는 거의 모든 헤더에는 다음과 같은 내용이 있습니다.

다음은 함수로 선언해야 하거나 매크로로 정의할 수 있습니다. 기능적 프로토타입이 제공되어야 합니다.

이것은 어떤 사람들에게는 그런 의미가 될 수 있기 때문에 나를 괴롭힌다.기능내가 사용한 것들은 함수 포인터에 할당되지 않을 수도 있습니다.가능한다음과 같이 정의됩니다.매크로.

그러나 두 번째 부분("프로토타입이 제공되어야 합니다")은 다음과 같은 내용을 나타내는 것 같습니다.기능이름 지정은 표준에서 말하는 것과 다르므로 다른 이름에는 다음이 있어야 합니다.동일한 프로토타입(또는 적어도 모든 열거 가능한 측면에서 호환 가능) 표준에 지정된 것과 호환됩니다.

내 설명이 맞나요? 그렇지 않다면 실제 설명은 무엇입니까? 이 단락 아래에 나열된 인터페이스를 함수 포인터에 할당할 수 있습니까?

답변1

다음은 함수로 선언해야 하거나 매크로로 정의할 수 있습니다.

함수가 매크로로 정의되어 있으면 더 이상 함수를 참조할 수 없다는 의미는 아닙니다.

을 고려하면 isalnum일반적으로 매크로입니다.

#include <ctype.h>
#include <stdio.h>

int main(int argc, char **argv) {
  printf("%p\n", isalnum);
  printf("%d\n", isalnum('C'));
}

오늘날의 C에서 첫 번째 isalnum참조는 매크로가 될 수 없습니다. isalnum매크로인 경우 매크로 또는 동등한 것으로 선언되므로 isalnum(c)매개변수 없는 참조는 일치하지 않습니다. 두 번째 참조는 매크로 또는 함수일 수 있습니다(코드를 전처리기에 전달하여 확인할 수 있음). 후자를 확인하려면 적절하게 #undef괄호( )를 사용할 수 있습니다.(isalnum)('C')

C 표준에서 이 진술 뒤에 있는 실제 요구 사항은 이러한 방식으로 도입된 함수가 매크로로 정의된 경우에도 항상 실제 함수로 사용할 수 있어야 한다는 것입니다.

기능적 프로토타입이 제공되어야 합니다.

프로토타입 제작은 단순히 요구 사항이 아닌 다른 초점입니다.

extern int isalnum();

선언되면 헤더 파일은 모든 매개변수에 대한 완전한 프로토타입과 유형 정보를 제공합니다.

바라보다C 표준 라이브러리의 C 함수를 매크로로 정의참고용.

그 사람들이 말한다면기능네이밍은 표준과 다릅니다.

표준에 지정된 것과 다른 이름을 가진 함수는 표준과 관련이 없습니다(표준의 일반적인 요구 사항을 충족하는 한).

관련 정보