Je compile ce programme par g ++ et clang ++. Il y a une différence:
g ++ affiche 1, mais clang ++ affiche 2.
Il semble que
g ++: la variable externe est définie dans la portée la plus courte.
clang ++: la variable externe est définie dans la portée globale la plus courte.
La spécification C ++ a-t-elle des spécifications à ce sujet?
main.cpp
#include <iostream>
static int i;
static int *p = &i;
int main() {
int i;
{
extern int i;
i = 1;
*p = 2;
std::cout << i << std::endl;
}
}
other.cpp
int i;
version: g ++: 7.4.0 / clang ++: 10.0.0
compilation: $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
eddie kuo
la source
la source
MSVC
etclang-cl
(les deux donnent2
), il semble que leextern int i
soit complètement ignoré par les deux: même si je ne lie pas dans leother.cpp
fichier, le programme se construit et s'exécute.i
, il n'essaie pas.Réponses:
[basic.link/7] devrait être la partie pertinente de la norme. Dans le projet actuel, il est écrit:
Notez que l'exemple suivant correspond presque exactement à votre cas:
Donc, le programme devrait être mal formé. L'explication est ci-dessous l'exemple:
la source