Я не очень знаком с компилятором GCC, и я пытаюсь запустить код, используя два исходных файла в wandbox .Давайте начнем с первого кода, используя основной файл (по умолчанию) и второй исходный файл с именем other.cc
, следующим образом:
основной файл
#include <iostream>
struct A {
int i = 1;
static const int k = 1;
};
extern A a; // The object a is defined in other.cc
int main() {
std::cout << a.i << '\n';
std::cout << a.k << '\n';
}
other.cc
struct A {
int i = 1;
static const int k = 1;
};
A a{2};
Обратите внимание, что мне нужно вставить имя файла other.cc
в поле Параметры компилятора , слева от Wandbox,для того, чтобы этот файл был скомпилирован и связан с окончательным объектным файлом.Запустив этот код, я получу числа 2 и 1, напечатанные ниже, и они верны.
2
1
Теперь, если я исключу файл other.cc
из процессов компиляции и компоновки, удалив его имя из Параметры компиляции В поле я получаю сообщение об ошибке ссылки на элемент нестатических данных A::i
, используемый в выражении
std::cout << a.i << '\n';
Если я затем удалю этот оператор изкод, он , по-видимому, работает нормально, потому что компилятор заменяет переменную a.k
на ее постоянное значение 1 в оставшейся инструкции std::cout << a.k << '\n';
в main (), печатая 1. Но это считается неопределенным поведением,в соответствии с [basic.def.odr] / 10 и [intro.compliance] / 2 (2.3) .Обратите внимание на то, что «не требуется никакой диагностики», упомянутой в [basic.def.odr] /10.
Затем я пытаюсь заставить компилятор выдать ошибку в этом случае, используя некоторый флаг, который будетпредотвратить эту оптимизацию.Я уже пробовал с флагами -fkeep-static-consts
и -fno-keep-static-consts
, но безрезультатно.Есть ли другой флаг, который я мог бы использовать, чтобы избежать этого неопределенного поведения?
Я получил этот пример от этого обсуждения в C ++ std-обсуждение.
IЗнайте, что определение объекта a
в первом файле решит проблему.Но это не то, что я ищу с этим странным примером.Я просто пытаюсь получить лучшее представление о том, как работают компиляторы в этих необычных обстоятельствах.