Я компилирую эту программу с помощью g ++ и clang ++. Есть разница:
g ++ печатает 1, а clang ++ печатает 2.
Кажется, что
g ++: внешняя переменная определена в самой короткой области видимости.
clang ++: внешняя переменная определена в самой короткой глобальной области видимости.
Есть ли в C ++ спецификация?
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;
версия: g ++: 7.4.0 / clang ++: 10.0.0
компиляция: $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
Эдди Куо
источник
источник
MSVC
иclang-cl
(оба дают2
), кажется, чтоextern int i
оба полностью игнорируются: даже если я не буду ссылаться наother.cpp
файл, программа будет собираться и запускаться.i
, он не пытается.Ответы:
[basic.link/7] должен быть соответствующей частью стандарта. В текущем проекте говорится:
Обратите внимание, что следующий пример почти точно соответствует вашему случаю:
Итак, программа должна быть плохо сформирована. Объяснение ниже примера:
источник