0

我正在使用这个 javacpp 用 Ja​​va 中的 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 以正确的顺序发生?感谢你的帮助。

4

0 回答 0