如何使用LLVM javacpp清除输出缓冲区?如何使用LLVM javacpp执行fflush?

时间:2018-11-24 04:25:12

标签: buffer llvm fflush javacpp

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

0 个答案:

没有答案