我正在使用此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以正确的顺序发生? 感谢您的所有帮助。