ホームページ >バックエンド開発 >PHPチュートリアル >PHP拡張機能開発-07-関数呼び出し_PHPチュートリアル

PHP拡張機能開発-07-関数呼び出し_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:08:29949ブラウズ

1 関数の戻り値

ついに zval についての話が終わりました。先ほど関数の定義と使い方について話しましたが、関数の戻り値については話していませんでした。 C 拡張では関数の戻り値の型が zval であるため、このセクションを説明のためにここに置きます。
このセクションの課題では、加算、減算、乗算、除算の演算を完了するための簡単な計算機を作成します。 要件: 関数 Calculate(num1, num2, opt) を作成します。 num1 opt num2=?手術。上記のタスクを実行するコードを見てみましょう:
PHP_FUNCTION(計算)
{
int num1;
int num2;
char* オプション;
int opt_len;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lls",
)
&num1、&num2、&opt、&opt_len) ==失敗)
{
php_printf("パラメータエラー。例:calculate(123, 456, '+')n");
RETURN_NULL();
}
if(1 != opt_len)
{
php_printf("パラメータエラー。例:calculate(123, 456, '+')n");
RETURN_NULL();
}
スイッチ(opt[0])
{
ケース「+」:
return_value->type = IS_LONG;
スルー スルー スルー スルー スルー アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト
休憩;
ケース「-」:
return_value->type = IS_LONG;
num1 - num2 を使用します。
休憩;
ケース「*」:
return_value->type = IS_LONG;
return_value->value.lval = num1 * num2;
休憩;
ケース「/」:
return_value->type = IS_DOUBLE;
return_value->value.lval = num1 * 1.0 / num2;
休憩;
デフォルト:
return_value->type = IS_LONG;
return_value->value.lval = 0;
休憩;
}
}
上記のコードを見て、return_value がどこから来たのかについて疑問を感じませんか?
return_value はマクロ PHP_FUNCTION で定義されています。PHP_FUNCTION はこの変数を宣言し、この変数を NULL に割り当てます。
マクロの定義を見てみましょう。
#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
#define ZEND_FUNCTION(名前) ZEND_NAMED_FUNCTION(ZEND_FN(名前))
#define INTERNAL_FUNCTION_PARAMETERSint ht, zval *return_value,
zval **return_value_ptr、zval *this_ptr、intreturn_value_used TSRMLS_DC
上記のマクロ定義から、return_value は zval へのポインターです。PHP はこの変数を使用して関数の戻り値を指します。実際、単純な戻り値を実行できるマクロも用意されています。マクロ定義は次のとおりです。 RETVAL_*(v)、* はさまざまな変数タイプを表し、v は変数の値を表します (例: RETVAL_LONG(34))。その値は 34 です。

http://www.bkjia.com/PHPjc/477781.html

tru​​ehttp://www.bkjia.com/PHPjc/477781.html技術記事 1 関数の戻り値 ようやく zval についての説明が終わりました。先ほど関数の定義と使用法について説明しましたが、関数の戻り値については説明していませんでした。 C拡張では関数の戻り値の型がzvalなので…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。