IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

[Langage] Que signifie ## en C++ ?


Sujet :

Langage C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut [Langage] Que signifie ## en C++ ?
    Bonjour, j'essaye de comprendre un programme et je bloque sur la ligne suivante:
    detour((PBYTE)target, (PBYTE)##target##Trampoline, (PBYTE)##target##Detour)

    Je ne sais pas ce que représente ces ## d'autant que Trampoline et Detour ne sont pas définis (il y a detour et trampoline mais sans majuscule).

    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par supergrey Voir le message
    Bonjour, j'essaye de comprendre un programme et je bloque sur la ligne suivante:
    detour((PBYTE)target, (PBYTE)##target##Trampoline, (PBYTE)##target##Detour)
    Tu n'as pas donné la ligne complète.

    ## est un opérateur qui n'est valide que dans les macros (c'est pourquoi je sais que tu n'as pas tout donné), il permet de créer un nouveau symbole en concaténant deux symboles existant. Il est généralement pour créer un identificateur en concaténant un préfixe (qui est un identificateur) à un suffixe (qui par lui-même est un identificateur ou un littéral entier).

    Mais je ne vois pas comment complèter la ligne en question de manière à avoir un code correct. Il y n'y a pas de symboles qu'on peut former un concaténant ) à quoi que ce soit. Une extension courante dans les vieux préprocesseurs permet de mettre ## sans que l'opérateur ait de l'effet, je vais supposer que c'est le cas ici. Dans ce cas, on pourrait compléter et corriger la ligne comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define call(target) detour((PBYTE)target, (PBYTE)target##Trampoline, (PBYTE)target##Detour)
    La macro call est à appeler avec comme argument un symbole (par exemple X) et cet appel équivaut à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    detour((PBYTE)X, (PBYTE)XTrampoline, (PBYTE)XDetour)
    où XTrampoline et XDetour sont aussi des symboles.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    OK, mais du coup que contiennent ces symboles ?

    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define DETOUR(target) \
    	if (detour((PBYTE)target, (PBYTE)##target##Trampoline, (PBYTE)##target##Detour)) \
    		Log("Detour "#target" succeeded"); \
    	else \
    		Log("Detour "#target" failed");
     
     
    BOOL detour(PBYTE target, PBYTE targetTrampoline, PBYTE targetDetour) 
    {/*...*/}

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par supergrey Voir le message
    OK, mais du coup que contiennent ces symboles ?

    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define DETOUR(target) \
    	if (detour((PBYTE)target, (PBYTE)##target##Trampoline, (PBYTE)##target##Detour)) \
    		Log("Detour "#target" succeeded"); \
    	else \
    		Log("Detour "#target" failed");
     
     
    BOOL detour(PBYTE target, PBYTE targetTrampoline, PBYTE targetDetour) 
    {/*...*/}
    Salut,

    si dans ton programme tu écris:

    alors ça correspondra à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (detour((PBYTE)gollum, (PBYTE)gollumTrampoline, (PBYTE)gollumDetour)) 
    		Log("Detour gollum succeeded"); 
    	else 
    		Log("Detour gollum failed");

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    OK, j'ai compris... c'est pas vraiment indispensable, ça simplifie l'écriture quoi...
    Merci

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    ca peut être indispensable pour certaine forme génération de code en méta prog, ou dans les système de logs.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 454
    Par défaut
    Citation Envoyé par supergrey Voir le message
    OK, j'ai compris... c'est pas vraiment indispensable, ça simplifie l'écriture quoi...
    Merci
    Si, ça l'est, si tu tiens à utiliser les macros. Une autre façon d'aborder le problème est de raisonner par l'absurde : comment t'y prendrais-tu si ces opérateurs n'existaient pas ? Pour faire simple :

    # entoure la valeur du paramètre par des guillemets pour en faire une chaîne, car tu ne peux pas placer le nom du paramètre à l'intérieur d'une chaîne (le symbole resterait tel quel).

    ## permet de contaténer deux paramètres , ex foo##bar car, sinon, les deux noms concaténés formeraient un nouveau symbole, à priori non défini, ici foobar, qui ne voudrait rien dire. Ou qui risquerait de correspondre à quelque chose de complètement différent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débat] Les langages que tout programmeur doit connaître
    Par kisitomomotene dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 19/09/2005, 07h36
  2. Que signifie "Error : Data truncation" ??
    Par BouB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/05/2005, 16h20
  3. [SQL6]Que signifie ce LEFT ?
    Par guy2004 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/01/2005, 19h18
  4. Que signifie Pagesize ?
    Par anthony70 dans le forum Débuter
    Réponses: 3
    Dernier message: 31/08/2004, 13h31
  5. Que signifier $0 et $@
    Par jaabouc dans le forum Linux
    Réponses: 6
    Dernier message: 01/06/2004, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo