Следующий код (скомпилированный как часть большого проекта) не печатает числа (не только однобайтовые целые числа , но и любые из них: std::int32_t
, std::size_t
, double
, так далее). Конечно, этот код, скомпилированный сам по себе, прекрасно работает, и поэтому невозможно представить минимальный пример, который воспроизводит эту проблему: что-то в этом большом проекте вызывает это, но я не могу понять, что именно вызывает его - отсюда этот вопрос.
код:
std::int32_t n = 42;
std::cout << "test 1" << std::endl; // prints
std::cout << 3.14 << std::endl; // doesn't print
std::cout << 456464 << std::endl; // doesn't print
std::cout << n << std::endl; // doesn't print
std::cout << "test 2" << std::endl; // still doesn't print
printf("printf: %d\n", n); // prints
std::cout.clear();
std::cout << "test 3" << std::endl; // prints
std::cout << 42 << std::endl; // doesn't print
Выход:
test 1
printf: 1
test 3
Итак, числовые литералы 3.14
и 456464
и переменная n
не печатаются так же, как и строка test 2
(я пытаюсь напечатать строку после неудачной печати целого числа). Функция printf
работает. Я использую std::endl
, поэтому не должно быть никаких проблем с буферизацией.
Использование std::cout.clear()
, похоже, решает проблему (мы можем снова печатать строки), но только до тех пор, пока не будет напечатано другое число.
Какие манипуляции с выходными потоками потенциально могут вызвать это? Да, есть using namespace std;
.
Код скомпилирован с -std=c++11
с использованием цепочек инструментов GCC (я пробовал разные версии, включая 5.3.1, 6.3.1 и 8.2.0 - результат всегда один и тот же).
Командная строка компиляции:
g++ c -MMD -pipe -std=c++11 -fPIC -O3 \\
-fmax-errors=3 -msse4.1 -mavx2 source.cpp -o target/objects/source.o
Связывание командной строки:
g++ <object files> -o executable -s \\
-Wl,--build-id=uuid -static-libstdc++ -pthread -Wl,--no-undefined