为什么 printf 不能与 haskell 中的 ccall 一起使用?

问题描述 投票:0回答:1

MRE:

{-# LANGUAGE ForeignFunctionInterface #-}

import GHC.Ptr
import Foreign
import Foreign.C
import Control.Monad

foreign import ccall unsafe "fibonacci.c fib" c_fib :: Int -> Int

example :: IO ()
example =
    print (c_fib 5)     

main = example

斐波那契.c

int fib(const int n) {
    if (n == 1) {
        printf("here");
        return 1;
    }
    else {
        return n*fib(n-1);
    }
}

结果:

120 // does not print "here"

发生什么事了?

haskell printf ffi
1个回答
0
投票

发生这种情况是因为 stdout 是行缓冲的并且

printf("here")
不会刷新缓冲区。

您可以通过打印新行(

printf("here\n")
)或明确地刷新它。

printf("here");
fflush(stdout);
© www.soinside.com 2019 - 2024. All rights reserved.