1. ホーム
  2. c++

[解決済み] 引数に展開するだけのPROTOTYPEマクロに何の意味があるのか?

2023-06-21 02:47:41

質問

ヘッダーファイルには

#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

とすると、2番目に展開されます。

質問のコードにある "extra" の括弧についてですが、これは引数リストに複数の引数がある場合に必要なものです。これがないと、マクロの呼び出しに複数の引数があるため、1 つの引数だけで定義されたマクロと一致しません。

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