C/Cを使用してNode.jsモジュールを実装する(2)_node.js
過去を振り返り、新しいことを学ぶと幸せになれます
まず最初に、この V8 オンライン マニュアル (http://izs.me/v8-docs/main.html) を思い出してください。
前回のbuilding.gypファイルをまだ覚えていますか?
{
"ターゲット": [
{
"target_name": "アドオン",
"ソース": [ "addon.cc" ]
}
]
}
これと同じように、*.cc ファイルがさらにいくつかある場合は、次のようになります:
"ソース": [ "addon.cc", "myexample.cc" ]
前回は 2 つのステップに分けましたが、実際には、構成とコンパイルは次のようにまとめることができます。
$node-gypconfigurebuild
はい、続けましょう。
目次
関数パラメータ
いよいよパラメータについて話さなければなりません。
a と b を加算して結果を返す関数 add(a, b) があると仮定して、最初に関数の概要を記述します。
名前空間 v8 を使用;
ハンドル<値> Add(const Arguments& args)
{
HandleScope スコープ;
}
これは関数のパラメータです。まずはv8の公式マニュアルリファレンスを見てみましょう。
•int Length() const
•ローカル 演算子[](int i) const
残りは気にしない、この 2 つが重要です。 1 つは関数に渡されるパラメーターの数を表し、もう 1 つの括弧は添字インデックスを介して n 番目のパラメーターにアクセスするために使用されます。
角括弧内のインデックス演算子は、Node.js のすべての型の基本クラスである Local
•IsArray()
•IsBoolean()
•IsDate()
•IsFunction()
•IsInt32()
•IsNativeError()
•IsNull()
•IsNumber()
•IsRegExp()
•IsString()
•...
それらを 1 つずつリストするつもりはありません。残りについてはドキュメントを読んでください。 。:.゚ヽ(*´∀`)ノ゚.:。
これは後で使用する関数です。詳細については、v8 のドキュメントを参照してください。
名前が示すように、エラーをスローします。このステートメントの実行後は、Node.js ローカル ファイルで throw() ステートメントを実行するのと同じになります。例:
ThrowException(Exception::TypeError(String::New("引数の数が間違っています")));
throw new TypeError("引数の数が間違っています");
この関数はドキュメントにも記載されています。
具体的には、一部の関数は特定の値を返す必要がないか、現時点では戻り値がないため、これは null 値です。
やってみよう、サオニアン!
上記の点を理解すれば、すぐに a b のロジックを書けるようになると思います。Node.js 公式マニュアルからコードをコピーして、実行してみましょう。
#include
名前空間 v8 を使用;
ハンドル<値> Add(const Arguments& args)
{
HandleScope スコープ;
// 3 つ以上のパラメータを渡すことができることを意味しますが、実際には最初の 2 つだけを使用します
If(args.Length()
{
// エラーをスローします
ThrowException(Exception::TypeError(String::New("引数の数が間違っています")));
// null 値を返す
returnscope.Close(Unknown());
}
If(!args[0]->IsNumber() || !args[1]->IsNumber())
{
// エラーをスローし、null 値を返します
ThrowException(Exception::TypeError(String::New("Wrong argument")));
returnscope.Close(Unknown());
}
//
http://izs.me/v8-docs/classv8_1_1Value.html#a6eac2b07dced58f1761bbfd53bf0e366)
// `NumberValue` 関数
ローカル<数値> num = Number::New(args[0]->NumberValue() args[1]->NumberValue());
}
最後にexport関数を記述すればOKです。
{
エクスポート->Set(String::NewSymbol("add"),
FunctionTemplate::New(Add)->GetFunction());
}
NODE_MODULE(アドオン、初期化)
コールバック関数
前の章では、Hello world についてのみ説明しました。この章では、おばあちゃんが意識的な発見をし、別のコールバック関数を作成しました。
いつものように、最初にフレームワークを作成します。
名前空間 v8 を使用;
ハンドル<値>RunCallback(const Arguments& args)
{
HandleScope スコープ;
returnscope.Close(Unknown());
}
func(関数(msg) {
console.log(msg);
});
つまり、パラメータをコールバック関数に渡し、それを console.log() で出力できると想定します。
まず文字列シリーズが必要です
早速、最初に文字列を与えてから、それについて話しましょう。 (√ ε :)
ただし、Node.js コードの型指定が弱いため、この文字列をユニバーサル型にする必要があります。
Local
え? Local
それでは、それについて少しお話しさせてください。ここと V8 リファレンス ドキュメントを参照してください。
ドキュメントに示されているように、Local
それではローカルについて話しましょう。
ハンドルにはローカル ハンドルと永続ハンドルの 2 種類があり、それぞれローカル
次に、パラメータテーブルシリーズが必要です
ターミナルのコマンドラインから C/C を呼び出した後、コマンドラインパラメータを取得するにはどうすればよいですか?
#include
void main(int argc, char* argv[])
{
// ...
}
ちなみに、ここでのargcはコマンドラインパラメータの数、argv[]は各パラメータです。次に、Node.js のコールバック関数を呼び出します。v8 も同様の方法を採用しています。
int argc,
ハンドル<値> argv[]
);
~~QAQ が Handle
多くの側面 (SegmentFault、StackOverflow、KouKou グループ) で検証した結果、上記の関数の 3 つのパラメーターの意味が最終的に解決されました。
次の 2 つのパラメータについては多くは説明しません。1 つはパラメータの数で、もう 1 つはパラメータの配列です。最初のパラメータ Handle
JS での apply と同じです。
cb.apply(context, [ ...args...]);
最初の引数として渡されるオブジェクトは、関数スコープ内で this になります。JS について詳しくない場合は、ここで JS の詳細を参照してください。http://unschooled.org /2012/03/undering-javascript-this/
——StackOverflow
つまり、その機能は呼び出される関数の this ポインタを指定することです。この Call の使用法は、JavaScript の binding()、call()、および apply() に似ています。
したがって、私たちがしなければならないことは、最初にパラメータテーブルを構築し、次に実行のために Call 関数を渡すことです。
最初のステップは変換関数を表示することです。変換関数は元々オブジェクト型であるためです。
ローカル<関数> cb = ローカル<関数>::Cast(args[0]);
2 番目のステップは、パラメーター テーブル (配列) を作成することです:
Local
ラストコール機能シリーズ
cb を呼び出してパラメータを渡します:
cb->Call(Context::GetCurrent()->Global(), 1, argv);
ここでの最初のパラメータ Context::GetCurrent()->Global() は、関数の this としてグローバル コンテキストを取得することを意味します。2 番目のパラメータはパラメータ テーブル内の番号です (結局、Node.js ですが)。配列には長さ属性がありますが、実際にはシステムは C の配列の長さを知らないため、配列の長さを示すために自分で数値を渡す必要があります); 最後のパラメーターは作成したばかりのパラメーター テーブルです。 。
最終章ファイナルドキュメントシリーズ
関数を作成し、それをエクスポートされた関数に入れて、最後に宣言するというこのステップについては、誰もがすでによく知っていると思います。
コードを直接リリースするだけですが、Node.js ドキュメントに直接アクセスすることもできます。
#include
名前空間 v8 を使用;
ハンドル<値>RunCallback(const Arguments& args)
{
HandleScope スコープ;
ローカル cb = ローカル::Cast(args[0]);
const unsigned argc = 1;
Local
cb->Call(Context::GetCurrent()->Global(), argc, argv);
returnscope.Close(Unknown());
}
void Init(Handle
NODE_MODULE(アドオン、初期化)
完了しました。残りの手順は自分で実行してください。この関数を JS で呼び出すことについては、以前に説明しました。
追加
さて、勉強ノートがどんどん自由になってきている気がしますので、分解してください~
今日はこの辺で、勉強ノートを書いている途中でCall関数のパラメータの意味などでまた困ってしまいました。
この一連の学習ノートがまだ役立つと思われる場合は、ぜひ一緒に楽しんでください〜Σ>―(〃°ω°〃)♡→

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック








![WLAN拡張モジュールが停止しました[修正]](https://img.php.cn/upload/article/000/465/014/170832352052603.gif?x-oss-process=image/resize,m_fill,h_207,w_330)
Windows コンピュータの WLAN 拡張モジュールに問題がある場合、インターネットから切断される可能性があります。この状況はイライラすることがよくありますが、幸いなことに、この記事では、この問題を解決し、ワイヤレス接続を再び正常に動作させるのに役立ついくつかの簡単な提案を提供します。 WLAN 拡張モジュールが停止しました。 WLAN 拡張モジュールが Windows コンピュータで動作を停止した場合は、次の提案に従って修正してください。 ネットワークとインターネットのトラブルシューティング ツールを実行して、ワイヤレス ネットワーク接続を無効にし、再度有効にします。 WLAN 自動構成サービスを再起動します。 電源オプションを変更します。 変更します。詳細な電源設定 ネットワーク アダプター ドライバーを再インストールする いくつかのネットワーク コマンドを実行する それでは、詳しく見てみましょう

この記事では、無線 LAN 拡張モジュールが起動できないことを示すイベント ID10000 を解決する方法について詳しく説明します。このエラーは、Windows 11/10 PC のイベント ログに表示される場合があります。 WLAN 拡張モジュールは、独立系ハードウェア ベンダー (IHV) および独立系ソフトウェア ベンダー (ISV) がカスタマイズされたワイヤレス ネットワーク機能をユーザーに提供できるようにする Windows のコンポーネントです。 Windows のデフォルト機能を追加することで、ネイティブ Windows ネットワーク コンポーネントの機能を拡張します。 WLAN 拡張モジュールは、オペレーティング システムがネットワーク コンポーネントをロードするときに、初期化の一部として開始されます。無線 LAN 拡張モジュールに問題が発生して起動できない場合、イベント ビューアのログにエラー メッセージが表示されることがあります。

定数は変数とも呼ばれ、一度定義されると、その値はプログラムの実行中に変更されません。したがって、変数を固定値を参照する定数として宣言できます。テキストとも呼ばれます。定数は、Const キーワードを使用して定義する必要があります。構文 C プログラミング言語で使用される定数の構文は次のとおりです - consttypeVariableName; (または) consttype*VariableName; さまざまなタイプの定数 C プログラミング言語で使用されるさまざまなタイプの定数は次のとおりです: 整数定数 - 例: 1,0 、34、4567 浮動小数点定数 - 例: 0.0、156.89、23.456 8 進数および 16 進数の定数 - 例: 16 進数: 0x2a、0xaa.. 8 進数

VS Code および Visual Studio C++ IntelliSense は、特に大規模なプロジェクトで作業している場合、ライブラリを選択できない場合があります。 #Include<wx/wx.h> の上にマウスを移動すると、「ソース ファイル 'string.h' を開けません」というエラー メッセージが表示され (「wx/wx.h」に応じて異なります)、オートコンプリート関数が応答しなくなることがあります。この記事では、VSCode および VSC++ IntelliSense が機能しない場合、またはライブラリを抽出できない場合の対処法を説明します。私のインテリセンスが C++ で動作しないのはなぜですか?大きなファイルを扱う場合、IntelliSense が機能しないことがあります。

エラー コード 8C230002 が原因で、Xbox でコンテンツを購入または視聴できませんか?一部のユーザーは、本体でコンテンツを購入または視聴しようとすると、引き続きこのエラーが発生します。申し訳ありませんが、Xbox サービスに問題があります。後でもう一度お試しください。この問題のヘルプが必要な場合は、www.xbox.com/errorhelp にアクセスしてください。ステータス コード: 8C230002 このエラー コードは通常、サーバーまたはネットワークの一時的な問題によって発生します。ただし、アカウントのプライバシー設定や保護者による制限など、他の理由により、特定のコンテンツの購入または表示が妨げられる場合があります。 Xbox エラー コード 8C230002 を修正する Xbox 本体でコンテンツを視聴または購入しようとしたときにエラー コード 8C が表示された場合

整数配列 Arr[] を入力として受け取ります。目標は、再帰的メソッドを使用して配列内の最大要素と最小要素を見つけることです。再帰を使用しているため、長さ = 1 に達するまで配列全体を反復処理し、基本ケースを形成する A[0] を返します。それ以外の場合、現在の要素は現在の最小値または最大値と比較され、その値は後続の要素に対して再帰的に更新されます。この場合のさまざまな入出力シナリオを見てみましょう −入力 −Arr={12,67,99,76,32}; 出力 −配列内の最大値: 99 説明 &mi

数値をさまざまな形式で表示することは、学習における基本的なコーディング問題の 1 つです。条件文やループ文などのさまざまなコーディング概念。アスタリスクなどの特殊文字を使用して三角形や四角形を印刷するさまざまなプログラムがあります。この記事では、C++ の正方形と同じように、数値をスパイラル形式で出力します。行数 n を入力として受け取り、左上隅から開始して右、次に下、次に左、次に上、そして再び右、というように移動します。数字付きスパイラル パターン 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

Ansible の動作原理は上図から理解できます: 管理側は管理側への接続に local、ssh、zeromq の 3 つの方法をサポートしています。デフォルトでは ssh ベースの接続が使用されます。この部分は接続に相当します。上のアーキテクチャ図のモジュール; アプリケーション タイプを押すことができます HostInventory (ホスト リスト) の分類は他の方法で実行されます. 管理ノードはさまざまなモジュールを通じて対応する操作を実装します. 単一のモジュールと単一のコマンドのバッチ実行を ad と呼ぶことができます-hoc; 管理ノードは、プレイブックを通じて複数のタスクのコレクションを実装できます。Web サービスのインストールとデプロイ、データベース サーバーのバッチ バックアップなど、ある種の機能を実装します。プレイブックは、システムが通過すると単純に理解できます。
