Saya mengkompilasi program ini dengan g ++ dan clang ++. Ada perbedaan:
g ++ mencetak 1, tetapi dentang ++ mencetak 2.
Tampaknya
g ++: extern varible didefinisikan dalam lingkup terpendek.
dentang ++: variabel ekstern didefinisikan dalam ruang lingkup global terpendek.
Apakah spesifikasi C ++ memiliki spesifikasi tentang itu?
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;
versi: g ++: 7.4.0 / clang ++:
kompilasi 10.0.0 : $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
eddie kuo
sumber
sumber
MSVC
danclang-cl
(keduanya memberi2
), tampaknyaextern int i
benar-benar diabaikan oleh keduanya: bahkan jika saya tidak menautkan dalamother.cpp
file, program membangun dan berjalan.i
, itu tidak mencoba.Jawaban:
[basic.link/7] harus menjadi bagian yang relevan dari Standar ini. Dalam draft saat ini, tertulis:
Perhatikan bahwa contoh berikut hampir sama persis dengan kasus Anda:
Jadi, programnya harus dibuat-buat. Penjelasannya di bawah contoh:
sumber