[解決済み] 引数に展開するだけの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);
ここからサンプルプログラムを見ていきます。
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)
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] g++ -Wreorderは何のためにあるのですか?
-
[解決済み] constポインタの意味とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件