Utilisez C/C pour implémenter les modules Node.js (2)_node.js
Revoir le passé et apprendre le nouveau peut vous rendre heureux
Tout d'abord, n'oubliez pas ce manuel en ligne V8 - http://izs.me/v8-docs/main.html.
Vous souvenez-vous encore du fichier building.gyp de la dernière fois ?
{
"cibles": [
{
"target_name": "module complémentaire",
"sources": [ "addon.cc" ]
>
]
>
Juste comme ça, si vous avez quelques fichiers *.cc supplémentaires, cela ressemblera à ceci :
"sources": [ "addon.cc", "monexemple.cc" ]
La dernière fois, nous avons séparé les deux étapes. En fait, la configuration et la compilation peuvent être mises ensemble :
$ node-gyp configurer build
Avez-vous fini de réviser ? sans? !
D’accord, continuons.
Table des matières
Paramètres de fonction
Maintenant, nous devons enfin parler des paramètres.
Imaginons qu'il existe une telle fonction add(a, b) qui représente l'ajout de a et b et le renvoi du résultat, alors écrivez d'abord le contour de la fonction :
#include
en utilisant l'espace de noms v8 ;
Poignée
{
Portée HandleScope ;
//... C'est reparti !
>
Arguments
C'est le paramètre de la fonction. Jetons d’abord un coup d’œil à la référence officielle du manuel de la v8.
•int Longueur() const
•Opérateur Local
Le reste on s’en fout, ces deux-là sont importants ! L'un représente le nombre de paramètres passés dans la fonction et l'autre crochet est utilisé pour accéder au nième paramètre via l'index d'indice.
Par conséquent, nous pouvons à peu près comprendre les exigences ci-dessus car args.Length() est 2, args[0] représente a et args[1] représente b. Et nous devons déterminer que le type de ces deux nombres doit être Nombre.
Notez que l'opérateur d'index entre crochets renvoie une Local
•IsArray()
•EstBooléen()
•EstDate()
•EstFonction()
•IsInt32()
•IsNativeError()
•EstNull()
•EstNuméro()
•IsRegExp()
•IsString()
•...
Je ne les listerai pas un par un, vous pouvez lire la documentation pour le reste. 。:.゚ヽ(*´∀`)ノ゚.:。
ThrowException
C'est une fonction que nous utiliserons plus tard. Les détails peuvent être trouvés dans la documentation v8.
Comme son nom l'indique, cela génère une erreur. Après avoir exécuté cette instruction, cela équivaut à exécuter une instruction throw() dans le fichier local Node.js. Par exemple :
ThrowException(Exception::TypeError(String::New("Mauvais nombre d'arguments")));
Cela équivaut à exécuter un Node.js :
throw new TypeError("Mauvais nombre d'arguments");
Non défini()
Cette fonction est également dans la documentation.
Plus précisément, il s'agit d'une valeur nulle, car certaines fonctions n'ont pas besoin de renvoyer de valeur spécifique, ou il n'y a pas de valeur de retour pour le moment, Undefined() doit être utilisé à la place.
Faisons-le, Saonian !
Après avoir compris les points ci-dessus, je pense que vous serez bientôt capable d'écrire la logique de a b. Je copierai le code du manuel officiel de Node.js et vous le donnerai pour que vous puissiez le parcourir :
#include
en utilisant l'espace de noms v8 ;
Poignée
{
Portée HandleScope ;
// signifie que plus de 2 paramètres peuvent être transmis, mais en fait nous n'utilisons que les deux premiers
Si(args.Length() < 2)
{
// erreur de lancement
ThrowException(Exception::TypeError(String::New("Mauvais nombre d'arguments")));
// Renvoie la valeur nulle
return scope.Close(Undefined());
>
// Si l'un des deux premiers paramètres n'est pas un nombre
Si(!args[0]->IsNumber() || !args[1]->IsNumber())
{
// Génère une erreur et renvoie une valeur nulle
ThrowException(Exception::TypeError(String::New("Wrong arguments")));
return scope.Close(Undefined());
>
// Veuillez vous référer à la documentation v8 pour plus de détails
// http://izs.me/v8-docs/classv8_1_1Value.html#a6eac2b07dced58f1761bbfd53bf0e366)
// Fonction `NumberValue`
Local
return scope.Close(num);
>
La fonction est terminée !
Enfin, écrivez la fonction d’export à la fin et c’est OK.
void Init (Handle
Après l'avoir compilé, nous pouvons l'utiliser comme ceci :
console.log(addon.add(1, 1) "b");
Vous verrez un 2b ! ✧。٩(ˊᗜˋ)و✧*。
Fonction de rappel
Dans le dernier chapitre, nous n'avons parlé que de Hello World. Dans ce chapitre, grand-mère a fait une découverte consciente et a écrit une autre fonction de rappel.
Comme d'habitude, nous écrivons d'abord le framework :
#include
en utilisant l'espace de noms v8 ;
Handle
{
Portée HandleScope ;
// ... crépitement crépitement
return scope.Close(Undefined());
>
Ensuite nous avons décidé de l'utiliser comme ceci :
func(fonction(msg) {
console.log(msg);
});
Autrement dit, il transmettra un paramètre à la fonction de rappel. Nous imaginons qu'il s'agit d'une chaîne, puis nous pourrons la console.log().
Vous devez d'abord avoir une série de chaînes
Sans plus attendre, alimentons-le d'abord en chaîne, puis parlons-en. (√ζε:)
Mais nous devons faire de cette chaîne un type universel, car le code Node.js est faiblement typé.
Local
Quoi ? Vous me demandez ce qu'est Local
Alors laissez-moi en parler un peu, référez-vous-y ici et au document de référence V8.
Comme indiqué dans la documentation, Local
Alors parlons du Local.
Il existe deux types de handle, Local Handle et Persistent Handle. Les types sont Local
Ensuite, vous devez avoir une série de tableaux de paramètres
Comment obtenir les paramètres de ligne de commande après avoir appelé C/C depuis la ligne de commande du terminal ?
#include
void main(int argc, char* argv[])
{
// ...
>
Au fait, argc est ici le nombre de paramètres de ligne de commande, et argv[] est chaque paramètre. En appelant ensuite la fonction de rappel de Node.js, la v8 utilise également une méthode similaire :
int argc,
Poignée
);
~~QAQ est bloqué dans Handle
Après l'avoir vérifié sous de nombreux aspects (SegmentFault, StackOverflow et un groupe KouKou), j'ai finalement résolu la signification des trois paramètres de la fonction ci-dessus.
Je ne dirai pas grand-chose sur les deux paramètres suivants. L'un est le nombre de paramètres et l'autre est un tableau de paramètres. Quant au premier paramètre Handle
C'est la même chose que d'appliquer en JS. En JS, vous le faites
.
var contexte = ...;
cb.apply(context, [ ...args...]);
L'objet passé comme premier argument devient ceci dans la portée de la fonction. Plus de documentation sur MDN Si vous ne connaissez pas bien JS, vous pouvez en savoir plus sur JS ici : http://unschooled.org. /2012/03/comprendre-javascript-this/
——Extrait de StackOverflow
En bref, sa fonction est de spécifier le pointeur this de la fonction appelée. L'utilisation de cet appel est similaire à bind(), call() et apply() en JavaScript.
Ce que nous devons donc faire est de construire d'abord la table des paramètres, puis de transmettre la fonction Call pour exécution.
La première étape consiste à afficher la fonction de conversion, car il s'agit à l'origine d'un type Objet :
Local
La deuxième étape consiste à créer une table de paramètres (array) :
Local
Série de fonctions de dernier appel
Appelez cb et passez les paramètres dans :
cb->Call(Context::GetCurrent()->Global(), 1, argv);
Le premier paramètre ici, Context::GetCurrent()->Global(), signifie obtenir le contexte global comme celui de la fonction ; le deuxième paramètre est le numéro dans la table des paramètres (après tout, bien que Node.js Le tableau a un attribut de longueur, mais le système ne connaît pas en fait la longueur du tableau en C, et vous devez transmettre vous-même un nombre pour indiquer la longueur du tableau ; le dernier paramètre est la table de paramètres que nous venons de créer) ; .
Série de documents finaux du chapitre final
Je pense que tout le monde connaît déjà cette étape, qui consiste à écrire la fonction, puis à la mettre dans la fonction exportée, et enfin à la déclarer.
Je vais simplement publier le code directement, ou vous pouvez accéder directement à la documentation Node.js.
#include
en utilisant l'espace de noms v8 ;
Handle
{
Portée HandleScope ;
Local
const argc non signé = 1;
Local
cb->Call(Context::GetCurrent()->Global(), argc, argv);
return scope.Close(Undefined());
>
void Init (exports Handle
NODE_MODULE(module complémentaire, Init)
Bravo ! Faites simplement les dernières étapes restantes vous-même. Quant à l’appel de cette fonction en JS, je l’ai déjà mentionné.
Extra
Eh bien, j'ai l'impression que mes notes d'étude deviennent de plus en plus libres. S'il vous plaît, décomposez-les ~
.Arrêtons-nous ici aujourd'hui. En train de rédiger des notes d'étude, j'ai encore eu des ennuis, comme la signification des paramètres de la fonction Call.
Si vous pensez que cette série de notes d'étude vous est toujours utile, venez me rejoindre pour vous amuser ~Σ>―(〃°ω°〃)♡→

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)
![Le module d'extension WLAN s'est arrêté [correctif]](https://img.php.cn/upload/article/000/465/014/170832352052603.gif?x-oss-process=image/resize,m_fill,h_207,w_330)
S'il y a un problème avec le module d'extension WLAN sur votre ordinateur Windows, cela peut entraîner une déconnexion d'Internet. Cette situation est souvent frustrante, mais heureusement, cet article propose quelques suggestions simples qui peuvent vous aider à résoudre ce problème et à rétablir le bon fonctionnement de votre connexion sans fil. Réparer le module d'extensibilité WLAN s'est arrêté Si le module d'extensibilité WLAN a cessé de fonctionner sur votre ordinateur Windows, suivez ces suggestions pour le réparer : Exécutez l'utilitaire de résolution des problèmes réseau et Internet pour désactiver et réactiver les connexions réseau sans fil Redémarrez le service de configuration automatique WLAN Modifier les options d'alimentation Modifier Paramètres d'alimentation avancés Réinstaller le pilote de la carte réseau Exécuter certaines commandes réseau Examinons-le maintenant en détail

Cet article détaille les méthodes permettant de résoudre l'événement ID10000, qui indique que le module d'extension LAN sans fil ne peut pas démarrer. Cette erreur peut apparaître dans le journal des événements du PC Windows 11/10. Le module d'extensibilité WLAN est un composant de Windows qui permet aux fournisseurs de matériel indépendants (IHV) et aux fournisseurs de logiciels indépendants (ISV) de fournir aux utilisateurs des fonctionnalités de réseau sans fil personnalisées. Il étend les fonctionnalités des composants réseau Windows natifs en ajoutant la fonctionnalité par défaut de Windows. Le module d'extensibilité WLAN est démarré dans le cadre de l'initialisation lorsque le système d'exploitation charge les composants réseau. Si le module d'extension LAN sans fil rencontre un problème et ne peut pas démarrer, vous pouvez voir un message d'erreur dans le journal de l'Observateur d'événements.

Une constante est aussi appelée variable et une fois définie, sa valeur ne change pas lors de l'exécution du programme. Par conséquent, nous pouvons déclarer une variable comme une constante faisant référence à une valeur fixe. On l'appelle aussi texte. Les constantes doivent être définies à l'aide du mot-clé Const. Syntaxe La syntaxe des constantes utilisées dans le langage de programmation C est la suivante - consttypeVariableName; (ou) consttype*VariableName; Différents types de constantes Les différents types de constantes utilisées dans le langage de programmation C sont les suivants : Constantes entières - Par exemple : 1,0 ,34, 4567 Constantes à virgule flottante - Exemple : 0.0, 156.89, 23.456 Constantes octales et hexadécimales - Exemple : Hex : 0x2a, 0xaa.. Octal

VS Code et Visual Studio C++ IntelliSense peuvent ne pas être en mesure de récupérer les bibliothèques, en particulier lorsque vous travaillez sur de grands projets. Lorsque nous survolons #Include<wx/wx.h>, nous voyons le message d'erreur "CannotOpen source file 'string.h'" (dépend de "wx/wx.h") et parfois, la fonction de saisie semi-automatique ne répond pas. Dans cet article, nous verrons ce que vous pouvez faire si VSCode et VSC++ IntelliSense ne fonctionnent pas ou n'extraient pas de bibliothèques. Pourquoi mon Intellisense ne fonctionne-t-il pas en C++ ? Lorsque vous travaillez avec des fichiers volumineux, IntelliSense parfois

Nous prenons le tableau d'entiers Arr[] en entrée. Le but est de trouver les éléments les plus grands et les plus petits d’un tableau en utilisant une méthode récursive. Puisque nous utilisons la récursion, nous allons parcourir l'ensemble du tableau jusqu'à ce que nous atteignions length = 1, puis retourner A[0], qui constitue le cas de base. Sinon, l'élément actuel est comparé à la valeur minimale ou maximale actuelle et sa valeur est mise à jour de manière récursive pour les éléments suivants. Examinons différents scénarios d'entrée et de sortie pour cela −Input −Arr={12,67,99,76,32}; Output −Valeur maximale dans le tableau : 99 Explication &mi ;

Vous ne parvenez pas à acheter ou à regarder du contenu sur votre Xbox en raison du code d'erreur 8C230002 ? Certains utilisateurs continuent de recevoir cette erreur lorsqu'ils tentent d'acheter ou de regarder du contenu sur leur console. Désolé, il y a un problème avec le service Xbox. Réessayez plus tard. Pour obtenir de l'aide sur ce problème, visitez www.xbox.com/errorhelp. Code d'état : 8C230002 Ce code d'erreur est généralement provoqué par des problèmes temporaires de serveur ou de réseau. Cependant, il peut y avoir d'autres raisons, telles que les paramètres de confidentialité de votre compte ou le contrôle parental, qui peuvent vous empêcher d'acheter ou de visualiser un contenu spécifique. Correction du code d'erreur Xbox 8C230002 Si vous recevez le code d'erreur 8C lorsque vous essayez de regarder ou d'acheter du contenu sur votre console Xbox

L’affichage des nombres dans différents formats est l’un des problèmes de codage fondamentaux de l’apprentissage. Différents concepts de codage comme les instructions conditionnelles et les instructions de boucle. Il existe différents programmes dans lesquels nous utilisons des caractères spéciaux comme des astérisques pour imprimer des triangles ou des carrés. Dans cet article, nous imprimerons les nombres sous forme de spirale, tout comme les carrés en C++. Nous prenons le nombre de lignes n comme entrée, et commençons par le coin supérieur gauche et nous déplaçons vers la droite, puis vers le bas, puis vers la gauche, puis vers le haut, puis encore vers la droite, et ainsi de suite. Motif en spirale avec chiffres 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

Le principe de fonctionnement d'Ansible peut être compris à partir de la figure ci-dessus : l'extrémité de gestion prend en charge trois méthodes locales, ssh et zeromq pour se connecter à l'extrémité gérée. La valeur par défaut est d'utiliser une connexion basée sur ssh. Cette partie correspond au module de connexion. dans le diagramme d'architecture ci-dessus ; il peut être connecté par type d'application. La classification HostInventory (liste d'hôtes) est effectuée d'autres manières. Le nœud de gestion implémente les opérations correspondantes via divers modules. Un seul module et l'exécution par lots d'une seule commande peuvent être appelés. -hoc ; le nœud de gestion peut implémenter un ensemble de tâches multiples via des playbooks. Implémenter un type de fonctions, telles que l'installation et le déploiement de services Web, la sauvegarde par lots de serveurs de base de données, etc. Nous pouvons simplement comprendre les playbooks au fur et à mesure que le système passe
