Perché le variabili locali extern con lo stesso nome in blocchi diversi ottengono collegamenti diversi tra compilatori in c ++?


12

Mentre stavo solo controllando quali collegamenti sono concessi alle variabili locali esterne,
ho scoperto che alcuni comportamenti diversi tra compilatori

per esempio se ho testato sotto il codice
come vedi nella variabile commenti vars hanno collegamenti diversi

// foo.cpp
int var = 10;                // external linkage

// main.cpp
#include <iostream>

static int var = 100;        // internal linkage

int main() {
    extern int var;          // internal linkage
    std::cout << var << std::endl;
    {
        extern int var;      // g++: external linkage , clang++: internal linkage
        std::cout << var << std::endl;
        {
            extern int var;  // g++: external linkage , clang++: internal linkage
            std::cout << var << std::endl;
        }
    }
}       

il risultato è

  • g ++: "100 10 10"
  • clang ++: "100 100 100" (msvc ++)

Dal risultato posso vedere che se ci sono più di due blocchi nidificati,
g ++ garantisce solo collegamenti esterni alle variabili

Potrei trovare una frase correlata nello standard
ma non è ancora chiaro perché il suo comportamento è diverso dai compilatori
( https://eel.is/c++draft/basic.link#6 )

Temo che il mio inglese sia pessimo, quindi non riesco a capirlo correttamente
Se qualcuno ha idea di quali compilatori stiano conformando bene lo standard
e, se possibile, qualcuno potrebbe elaborare ciò che lo standard dice esattamente per me?


1
Stackoverflow.com/questions/41978949/… correlati Credo che sia un bug gcc, lo standard fornisce l'esempio con la f()funzione e il più interno extern void f()ha un collegamento interno - vardovrebbe avere anche un collegamento interno qui, perché si riferisce alla stessa "entità".
KamilCuk

Le dichiarazioni dell'ambito del blocco IMO delle entità con collegamento esterno sono malvagie e la lingua sarebbe migliore vietandole
MM

@MM: le unità del modulo lo fanno!
Davis Herring,

Risposte:


4

Questo è l'argomento del numero aperto CWG1839 . L' intento attuale è che il comportamento di Clang e MSVC sia corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.