我正在使用这个 javacpp 用 Java 中的 LLVM 构建编译器。我能够为输入和输出生成代码。
输入:首先我有一个 LLVMValueRef,它是一个符号,比如说将接收输入的目标变量。然后我有一个 LLVMValueRef,它是 scanf 函数。我设置参数并构建函数调用然后传递。它工作得很好。
LLVMValueRef valueRef = symbol.getLlvmValueRef();
LLVMValueRef scanfFunction = LLVMGetNamedFunction(moduleRef, "scanf");
LLVMValueRef[] scanfArgs = { str, valueRef };
LLVMBuildCall(builderRef, scanfFunction, new PointerPointer(scanfArgs), 2, "scanf");
输出:同样,我可以打印出我想要的任何字符串。我有 printt,我可以使用 LLVMGetNamedFunction 获得它,然后我构建函数调用,传递构成要打印的字符串的所有参数。
LLVMValueRef printFunction = LLVMGetNamedFunction(moduleRef, "printf");
LLVMBuildCall(builderRef, printFunction, new PointerPointer(args), printArgs.size(), "printf");
我的问题:
如果我在 scanf 之前有 printf,则 scanf 总是排在第一位。我认为它与缓冲区有关,类似于这个问题: C/C++ printf() before scanf() issue
所以我尝试在构建每个 printf 调用后对其进行刷新。像这样:
LLVMValueRef[] fflushArgs = { LLVMConstNull(LLVMPointerType(LLVMInt8Type(), 0)) };
LLVMValueRef fflushFunction = LLVMGetNamedFunction(moduleRef, "fflush");
LLVMBuildCall(builderRef, fflushFunction, new PointerPointer(fflushArgs), 1, "fflush");
我的意图是调用 fflush(null)。
但是,我收到此错误:
LLVM 错误:试图执行未知的外部函数:fflush
所以,我可以访问 printf 和 scanf,但我不能使用 fflush
我怎样才能使用 FFLUSH?还有其他方法可以清除此缓冲区吗?我该怎么做才能让 printf 和 scanf 以正确的顺序发生?感谢你的帮助。