5

私はいくつかのコードを調べてリファクタリングしてきました。関数を次のように変更することになりました。

void setPerspective(float nearP = 0.1f, float farP = 1000.0f);

void setPerspective(float near = 0.1f, float far = 1000.0f);

そして、多くの奇妙なエラーが発生し始めまし'missing ;''missing )'

nearfarはで#definedのようwindef.hです。けっこうだ; 使用は避けます。

しかし、それから私は別のヘッダーファイルで気づきました:

void setPerspective(float fov, float aspect, float near, float far);

それでも問題はありません。これらのヘッダーファイルは両方とも同じ#includeです...

ある問題が発生しているのに、別の問題は発生していない理由はありますか?デフォルトのパラメータではないようです。#includeあるヘッダーファイルで問題を引き起こし、別のヘッダーファイルでは問題を引き起こさない可能性があるのは、任意の順序ですか?

4

4 に答える 4

7

トークンnearとは、おそらくこのようfarに空の場合は null と定義されています#define

#define near
#define far

そのため、プリプロセッサはそれらを null に置き換えます - コンパイラがソースを処理する前に消えます。

最初の関数宣言には、パラメーターへのデフォルトの割り当てが含まれています

void setPerspective(float nearP = 0.1f, float farP = 1000.0f);

コンパイラは、nearP と farP をパラメーター名およびfloat型として正しく解釈します。プリプロセッサに変更すると、それらがnullに置き換えられ、型への割り当てが行われます...そしてnearPコンパイラnearはフィットをスローします...これはコンパイラが見るものです:farPfarfloat

void setPerspective(float  = 0.1f, float  = 1000.0f);

2番目のヘッダーファイルでは、関数プロトタイプのパラメーターにデフォルトの割り当てがなく、コンパイラーはパラメーターが浮動小数点であると認識し、それらがnullであるため認識しません...したがって、これの代わりnearfar

void setPerspective(float fov, float aspect, float near, float far);

コンパイラはこれを見ます

void setPerspective(float fov, float aspect, float , float );

これは、完全に正当な関数プロトタイプです (パラメーターに名前を付ける必要はありません)。

于 2012-09-23T22:58:10.927 に答える
4

推測では、Windows マシンでコンパイルしています。

むかしむかしむかし、時のもやの中に失われた Intel 8086、80186、および 80286 のようなマシンがありました。これらのマシンでは、使用できるメモリが限られていました。彼らは主に 16 ビットのポインターを使用していました。しかしその後、プログラムが少し大きくなったため、さまざまなサイズのポインターを識別するための修飾子としてキーワードnearfarが追加されました。

あなたが直面しているのは、あの暗黒の原始時代の残り物です。正常なコンピューター (80386 以降) ではnearandfar表記は必要ありませんでしたが、コンパイラは後方互換性のためにこれらをサポートし続けました。

この診断が正確である場合は、名前nearfar;を使用しないでください。古いバージョンの言語から残ったキーワードとして扱ってください。

于 2012-09-23T22:39:38.640 に答える
2

この投稿を見てください: Near and Far pointers

それらは、さまざまなタイプのメモリにアクセスするためのポインタのタイプであったようですが、現在は使用されていません。

nearP、farPと呼ばれるのには理由があったようです。:)

于 2012-09-23T22:39:00.513 に答える
2

ヘッダー ファイルは、それ自身#includeのだけでなく、#includeそれらのヘッダーの前にルート ソース ファイルで発生する によっても影響を受けます。

/* foo.cpp */
#include "bar.h"
#include "foo.h" // foo.h is influenced by whatever is brought in by bar.h

識別子farおよびnear(その他の識別子も) は、8086/88 セグメント化アーキテクチャ (MS-DOS および Windows 3.x を実行) を対象とする一部のコンパイラに見られる拡張機能です。レガシ コードをサポートするために、Windows ヘッダー ファイルに何かが含まれている可能性があります#define far(何も定義しない)。

別の注意として、通常はdouble浮動小数点数に使用する必要があります。このfloat型は、ストレージを大きな配列に保存するためのものです ( より小さい場合もそうでない場合もありますdouble)。IEEE 754 浮動小数点数を持つプラットフォームでは、floatは通常 32 ビットの数値です。7 ビットの指数と 24 ビットの仮数があり、かなり貧弱です。一方double、 は 64 ビット型で、指数は 11 ビット、仮数は 52 ビットです。範囲と精度が大幅に向上します。

于 2012-09-23T22:44:54.077 に答える