シェーダーを作成するとき、#if #ifdef #if definedなどのコンパイル済みの命令がよくあります。混乱することがあるので、特定の使用法を注意深く確認し、簡単なテストを行うことにしました。
#define
#defineディレクティブは、マクロまたは定数を定義するために使用されます。
#defineには、次の2つの一般的な形式があります。
- #define識別子token-stringマクロを定義します。すべての識別子はプリコンパイル中にtoken-stringに置き換えられます。定数をよりわかりやすい名前に置き換えることができます。例:#define PI 3.1415926
- #define識別子(argument0、...、argumentN-1)token-stringは、関数のようなマクロを定義します。次に例を示します。#define AREA(area、w、h)(area = w * h);
// #define 的使用 //
#define SOME_MACRO
#define PI 3.141593
最初の方法は、マクロを定義するときに使用されます。トークン文字列が指定されていない場合、次の2つの点に注意してください。
- 識別子はまだ定義されており、#ifdefinedまたは#ifdefを使用して検出できます
- すべての識別子文字が削除されるか、すべての識別子文字が空の文字列に置き換えられます。
詳細については、#defineドキュメントを参照してください。
#if
#ifは、ソースファイルのどの部分をコンパイルするかを制御するための前処理ディレクティブです。
形式は次のとおりです。#if条件は
単に#ifに続く条件ステートメント(条件)です。実行結果が0でない場合、#ifステートメントブロック内のコードはコンパイルされます。それ以外の場合はコンパイルされません。
#elifおよび#elseは、通常のキーワードelse ifおよびelseと比較して、条件を決定できます。違いは、命令が実行時ではなく前処理段階で実行されることを示すために、先頭に#記号が追加されることです。最後に、すべての判断が終わった後、準備されたステートメントの範囲を決定するための最後として#endifを使用する必要があります。
// #if 的使用 //
#define SOME_MACRO 0
#if SOME_MACRO
return float4(1,1,1,1);
#else
return float4(0,0,0,1);
#endif
上記のコードの結果は黒を返します
// #if 的使用 //
#define SOME_MACRO
#if SOME_MACRO
return float4(1,1,1,1);
#else
return float4(0,0,0,1);
#endif
上記のコードはエラーを報告します:無効またはサポートされていない整数定数式
詳細については、#ifドキュメントを参照してください。
#ifdef
#ifdefは、定数またはマクロが定義されているかどうかを判別するために使用されます。
形式は次のとおりです。#ifdef識別子
識別子はマクロまたは定数であり、#defineディレクティブで定義できます。識別子が定義されている場合、#ifdefのコードステートメントブロックがコンパイルされます。それ以外の場合はコンパイルされません。
#ifdefは、定数またはマクロが定義されているかどうかを判断するだけであり、式の判断には使用できませんが、#ifは次のように使用できます。
#define CONST_VALUE 3
#if CONST_VALUE > 1
return float4(1,1,1,1);
#else
return float4(0,0,0,1);
#endif
#ifdef CONST_VALUE > 1 // 这样写会报错 //
hlslドキュメントの記述では、#ifdefは以前のバージョンとの互換性のためにのみ記述されています。判断するには、definedを使用することをお勧めします。つまり、この形式で#if defined(MACRO)を使用することをお勧めします。これについては次に説明します。
These directives are provided only for compatibility with previous versions of the language. The use of the defined operator with the #if directive is preferred.
詳細については、#ifdefドキュメントを参照してください。
#定義されている場合
これは、ドキュメントに書き込むためのより推奨される方法です。
#if definedと#ifdefの両方を使用して、マクロが定義されているかどうかを判断できます。#if!definedは#ifndefと同等です。
#define SOME_MACRO
// #if defined 的使用 //
#if defined(SOME_MACRO)
// do something //
#elif defined(OTHER_MACRO)
// do something else //
#endif
// #ifdef 的使用 //
#ifdef SOME_MACRO
// do something //
#endif
#ifdef OTHER_MACRO
// do something else //
#endif
総括する
- コードの一部を実行するかどうかを決定するためにマクロが定義されているかどうかに基づいている場合は、#if defined(MACRO)を使用することをお勧めします。
- 式の値が0であるかどうかに基づいて、コードを実行する必要があるかどうかを判断する場合は、#if条件メソッドを使用することをお勧めします。
- #ifdefは、式を判断するためではなく、マクロまたは定数が定義されているかどうかを判断するために使用されます。#ifは、式を判断するために使用できます。
著者:8時の
リンク:https://www.jianshu.com/p/5b763006b61e
出典:ジェーンの本の
著作権は著者にあります。商用の再版の場合は、著者に連絡して許可を求めてください。非商用の再版の場合は、出典を示してください。