Я новичок в C++ и подумывал о запуске приложения, которое интегрирует lua в качестве языка расширения. Я скопировал откуда-то простой код REPL, приведенный ниже, и слегка адаптировал его к C++, но «в конце» и «fprintf в конце» не появляются, когда я запускаю в режиме выпуска после завершения ввода с помощью Ctrl+D, несмотря на мои множественные варианты вызова сброса, но появляются, когда я запускаю в режиме отладки, даже без каких-либо точек останова. Это довольно деморализующее начало того, что должно быть легкой частью; что мне не хватает? Я работаю на MacO в CLion с помощью набора инструментов clang, предоставляемого XCode, если это имеет значение.
#include <iostream>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
int main() {
std::cout << "at beginning" << std::endl;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
for (std::string line; std::getline(std::cin, line);) {
const char *cLine = line.c_str();
int error = luaL_loadstring(L, cLine) || lua_pcall(L, 0, 0, 0);
if (error) {
const char *luaOut = lua_tostring(L, -1);
std::cerr << luaOut << std::endl;
lua_pop(L, 1);
} else {
std::cout << "output above a result of evaluating: ["
<< line
<< "]"
<< std::endl;
}
}
lua_close(L);
std::cout << "at end" << std::endl;
fprintf(stdout, "fprintf at end\n");
std::flush(std::cout);
std::cout.flush();
fflush(stdout);
fflush(NULL);
return 0;
}
пример сеанса ниже:
at beginning
print(2 ** 3)
[string "print(2 ** 3)"]:1: unexpected symbol near '*'
print(2 ^ 3)
8.0
output above a result of evaluating: [print(2 ^ 3)]
print("hope this works, too")
hope this works, too
output above a result of evaluating: [print("hope this works, too")]
^D
Обновлять
Если я закомментирую цикл, операторы std::cout в конце будут работать как положено. Если я закомментирую тело цикла, но оставлю оператор for нетронутым, операторы std::cout после цикла не будут работать.
Второе обновление
Запустив терминал и увидев, что все работает, а также прочитав комментарии ниже, кажется, что проблема не в коде C++, а в CLion. Я добавляю тег CLion. Если я не смогу найти решение этой очень тревожной проблемы, я откажусь от CLion, что меня разочаровывает, поскольку мне очень нравятся все остальные IDE JetBrains.
Если программа не перестает работать при нажатии ctrl-d, то где она тратит свое время? Прикрепите к нему отладчик и сломайте.
Придерживайтесь ввода-вывода C++, избегайте функций f*. Если первый смыв (<< std::endl;) не сработал, добавление еще четырех смывов не поможет.
Сработает ли это, если удалить все, что связано с Lua?
По совету @Someprogrammerdude я добавил выходные данные внутри цикла. В исходном посте я должен был ясно дать понять, что проблема не в Lua — он оценивает и печатает результаты, которые я ожидал.
@molbdnilo Да, это работает, когда я удаляю lua-включения и код Lua, так что остаются только вызовы std::cout плюс std::cout.flush()
@Botje В том-то и дело: программа останавливается, когда я нажимаю Ctrl+D, и, насколько я могу судить, весь код после выполнения цикла просто ничего не выводит, за исключением случаев, когда я запускаю в режиме отладки, даже без каких-либо точек останова. Это похоже на принцип неопределенности Гейзенберга: добавление отладчика и наблюдение за происходящим приводит к исправлению всего.
Не могу воспроизвести это на своем Mac. Я создал ваш код с помощью простого g++, и он всегда печатает для меня сообщения «в конце».
Ты бежишь изнутри Клиона? Вы пробовали запустить его самостоятельно в независимом терминале? В прошлом у Clion были проблемы с фактическим сбросом вывода при запуске изнутри Clion.
@Someprogrammerdude Да, я запускал это из CLion. Когда я запускаю его из терминала, я получаю нормальный результат.
@SourceSimian Так что я бы просто назвал эту штуку CLion «мусором» - или, может быть, она не поддерживает Ctrl-D или использует что-то еще для обозначения EOF.
@ChristianStieber Ctrl+D работает. Он закрывает ввод и завершает программу с кодом выхода 0; Похоже, проблема в том, что CLion неправильно обрабатывает выходные данные программы. Проведя небольшое исследование, выяснилось, что это старая и постоянная проблема: youtrack.jetbrains.com/issue/CPP-5704





Оказывается, это не было проблемой кода ни на одной итерации. Проблема в том, что в CLion есть старая и не исправленная ошибка:
https://youtrack.jetbrains.com/issue/CPP-5704
Отключение run.processes.with.ptty дало мне ожидаемый результат.
Добавьте больше вывода
std::coutвнутри цикла. Выведите значенияline,cLineиerror. Добавьте кавычки вокруг вывода строки, чтобы увидеть, есть ли неожиданные пробелы.