Je suis tombé sur un morceau de code . Quelle est la signification de
ici ? Je sais les références de rvalue mais je pense que utilisé dans ce contexte est différent. Que signifie
indiquer dans `` ?
Réponses
Trop de publicités?`` est l’extension du CCG pour obtenir l’adresse de l’étiquette définie dans la fonction en cours.
``est illégal dans le standard C99 et C++.
Cette compile avec g ++.
Comment la trouver
C'est l'adresse d'un label et c'est une caractéristique spécifique à GCC.
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
Vous pourriez avoir pensé à elle-même par les tests:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
Auquel cas GCC dit:
erreur: l'étiquette " a " utilisé mais non défini
Sous le capot - assemblée
Vous avez besoin de savoir l'assembleur pour bien comprendre cela, mais je vais essayer de vous expliquer ce qu'est une adresse d'un label.
Après le système d'exploitation charges de l' .exe fichier à partir du disque, un composant du système d'exploitation appelé le "loader" (windows a la "PE Loader", linux a "chargeur ELF" ou peut-être même à d'autres, si ils sont compilés dans le noyau), il le fait d'une "virtualisation" de ce programme, le transformant en un processus.
Ce processus pense qu'il est le seul dans la RAM et il a accès à la totalité de la RAM (qui est, 0x00000000-0xFFFFFFFF sur une machine 32 bits).
(ce qui précède est juste un court overwiew de ce qui est passe, vous avez vraiment besoin d'apprendre de l'assemblée pour bien le comprendre, si patient avec moi)
Maintenant, l'étiquette dans un code source est fondamentalement une adresse. "goto label;" ne fait rien d'autre qu'un saut à cette adresse (pensez au pointeur d'instruction dans l'assemblage). Ce label magasins de RAM de répondre, et c'est la façon dont vous pouvez trouver cette adresse.
Après que vous avez appris ASM, vous vous rendrez compte que cette adresse pointe vers un enseignement au sein de l' .text
de la section de l'exécutable. L' .text
section est celle qui vous tient le programme (binaire) de l'exécution d'un code.
Vous pouvez inspecter ce avec:
objdump -x un.hors
Un exemple pratique
Comme décrit dans GCC, vous pouvez l'utiliser pour initialiser un saut de la table. Certains scanner générateurs comme re2c (voir l' -g
paramètre) l'utiliser pour générer plus de scanner compact. Peut-être il y a même un analyseur générateur en employant la même technique.