[c++] 인수로만 확장되는 PROTOTYPE 매크로의 요점은 무엇입니까?

포함 된 헤더 파일이 있습니다.

#define PROTOTYPE(s) s

그 요점은 무엇입니까? 입력을 그 자체로 대체하는 것처럼 보입니다.

주변에 다른 지시문이 많이 있지만 정의 된 경우 베어링을 확인한 것으로 보이는 유일한 지시문은 다음과 같습니다 #ifndef PROTOTYPE.. 이 작업을 수행하는 HDF4 헤더 파일의 일부 위치를 찾았습니다 #define PROTOTYPE. 그래서, 그 어느 것도 내 질문을 정말로 명확하게 해주지 않습니다. 여전히 쓸모없는 것 같습니다.

사용 방법은 다음과 같습니다.

CS_RETCODE clientmsg_callback PROTOTYPE((
CS_CONTEXT * context,
CS_CONNECTION *connection,
CS_CLIENTMSG *clientmsg));

이것은 Sybase Open Client를 사용하는 프로젝트의 일부입니다. clientmsg_callback은 나중에 여기에서 사용됩니다.

ct_callback(context, NULL, CS_SET, CS_CLIENTMSG_CB,
                  (CS_VOID *)clientmsg_callback);

여기에서 샘플 프로그램을 시작하겠습니다.

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc35570.1570/html/clcprgde/clcprgde10.htm

clientmsg_callback은 나중에 구현됩니다. 샘플은 원래 C ++ 대신 C를 염두에두고 작성되었다고 생각합니다. 아마도 그것과 관련이 있습니까?



답변

정말, 정말 초기 C의 옛날에는 프로토 타입 같은 것이 없었습니다. 함수 인수 목록은 함수의 괄호 뒤에 오는 다음과 같이 :

square(x)
int x;
{
int y = x * x;
return y;
}

물론 요즘에는 인수가 괄호 안에 들어갑니다.

square(int x)
{
int y = x * x;
return y;
}

“누락 된”반환 유형에 유의하십시오. C 함수는 암시 적으로를 반환하는 데 사용되었으며 int다른 반환 유형이 필요한 경우에만 해당 내용을 말해야했습니다.

함수 선언 에는 또 다른 규칙 세트가 있습니다. K & R C (고대 버전)의 함수 선언에는 인수가 없습니다.

int square();

ANSI C의 함수 프로토 타입 에는 인수 목록이 있습니다.

int square(int x);

전환하는 동안 사람들은 이상한 매크로를 사용하여 두 가지 방법으로 컴파일 할 수있었습니다.

int square(PROTOTYPE(int x));

#define PROTOTYPE(s)

첫 번째 버전으로 확장됩니다.

#define PROTOTYPE(s) s

두 번째로 확장됩니다.

질문에있는 코드의 “추가”괄호와 관련하여 인수 목록에 인수가 두 개 이상있을 때 필요합니다. 그것들이 없으면 매크로 호출에는 둘 이상의 인수가 있으므로 하나의 인수로 정의 된 매크로와 일치하지 않습니다.

PROTOTYPE(int x, int y)   // error: too many arguments
PROTOTYPE((int x, int y)) // ok: only one argument (enclosed in parentheses)


답변

이와 같은 매크로는 헤더 파일의 프로토 타입에서 다음과 같은 것을 허용하는 데 사용됩니다.

int foo PROTOTYPE((int bar));

ANSI C가 감지되면 ( __STDC__1로 정의 됨) 다음으로 확장됩니다.

int foo(int bar);

ANSI C가 감지되지 않으면 다음으로 확장됩니다.

int foo();

C가 표준화되기 전에 일반적이었습니다.

일부 라이브러리는 여전히이 작업을 수행합니다. 살펴보면 tcpd.h(사용 가능한 경우) 다음이 표시됩니다.

/* someone else may have defined this */
#undef  __P

/* use prototypes if we have an ANSI C compiler or are using C++ */
#if defined(__STDC__) || defined(__cplusplus)
#define __P(args)       args
#else
#define __P(args)       ()
#endif

이것은 그것을 잘 설명합니다.

이중 괄호의 __P(arg1, arg2)경우 구문 오류 (매크로에 너무 많은 인수를 전달 함)가 발생하지만 __P((arg1, arg2))괜찮습니다 (괄호로 묶인 하나만).

이것은 __extension__((...))GNU C에서 와 비슷합니다 . GNU가 아닌 컴파일러에서는 #define __extension__(unused)단지 하나의 “인수”가 괄호로 둘러싸여있는 것처럼 반 이식 가능한 코드를 갖기 만하면 됩니다.


답변