Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140

    [C++] linkage esterno e interno

    Ciao a tutti... la mia prof ha detto che il tipo struttura ha linkage interno, mentre un oggetto di tipo struttura ha linkage esterno. Esempio:
    codice:
    struct complesso {
        double reale;
        double immag;
    };
    
    complesso c1;
    in questo esempio complesso ha linkage interno, mentre c1 ha linkage esterno!
    E' vera questa cosa? perchè su altri libri non mi pare di averla letta...
    Vi ringrazio in anticipo

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non risulta nemmeno a me, a meno che non intendesse dire che i campi della struttura sono accessibili solo tramite la struttura.

    variabilestruttura.campo

    Meglio se le chiedi lumi.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    Estendendo il discorso a una generica dichiarazione di tipo (esempio struttura, classe...) ...
    io so che quando usiamo questo tipo in più unità di compilazione, dobbiamo scrivere la dichiarazione del tipo in ogni unità! Ma quindi un tipo struttura (o classe) ha linkage interno o esterno? oppure nessuno dei due?
    Grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il linkage esterno ce l'ha, ad esempio, un identificatore come

    extern int x;

    che, posto in tanti moduli, ha necessità di essere risolto dal linker.

    La corrispondente dichiarazione

    int x;

    che si troverà in un altro modulo, ha linkage interno.

    Per il resto, fatti chiarire dalla prof.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    dobbiamo scrivere la dichiarazione del tipo in ogni unità!
    codice:
    struct complesso {
        double reale;
        double immag;
    };
    Questo dice al compilatore come è fatta un'eventuale varibile complesso, vale ne più ne meno come un int a livello di linkage.
    codice:
    complesso c1;
    Questa è la dichiarazione della variabile che dev'essere fatta in un unico file .c o .cpp. Per renderla visibile ad altri moduli si usa mettere nel file .h;
    codice:
    extern complesso c1;
    per specificare che la variabile in oggetto ha un extern linkage appunto.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    La corrispondente dichiarazione

    int x;

    che si troverà in un altro modulo, ha linkage interno.
    Un attimo.... se noi scriviamo extern int x in un altro modulo significa che stiamo importando un identificatore x da un altro modulo.... per fare questo però la corrispondente dichiarazione deve avere linkage ESTERNO! o sbaglio?

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    extern fornisce il linkage esterno.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    leggendo sul mio libro mi risulta che extern serve a importare un identificatore (con linkage esterno) dichiarato in un altro modulo.... se l'identificatore da importare ha linkage interno(esempio una variabile locale di una funzione) questo non può essere importato con extern... probabilmente sto facendo confusione e dovrei rileggere meglio... boh

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il linkage ha senso solo per variabili globali.
    Quelle interne alle funzioni non centrano niente, visto che sono locali appunto.
    Se dichiari una variabile globale in un file .c o .cpp. quella variabile ha linkage interno visto che nessun altro modulo sa che esiste.
    Per renderla visibile al mondo devi mettere la dichiarazione in un file .h.
    In questo modo però ogni modulo che includerà quel .h si ritroverà un duplicato di quella variabile.
    Per evitare questo si antepone extern che in sostanza dice al linker:

    Attento: questa variabile esiste ma si trova in un solo file .c o .cpp. Tu quando componi i file oggetto per creare l'eseguibile e incontri extern quel che è, non fare il linking subito ma aspettati di trovare la definizione vera e propria della variabile da un'altra parte.

    Questo è il linkage esterno.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    Per quanto riguarda l'uso di extern ci siamo...
    Non siamo però in accordo sul concetto di linkage....
    Se dichiari una variabile globale in un file .c o .cpp. quella variabile ha linkage interno visto che nessun altro modulo sa che esiste.
    Per me una variabile globale ha linkage esterno perchè può essere utilizzata anche in altri moduli e non solo nel modulo in cui è dichiarato... il linkage è una proprietà di una variabile o di una funzione (linkage interno se l'entità è visibile solo nello stesso modulo in cui è dichiarata, linkage esterno se visibile anche in altri moduli)
    Io ho dedotto tutto questo leggendo sul mio libro e su questo sito... Prova a dargli un'occhiata anche tu!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.