【发布时间】:2018-04-20 13:33:59
【问题描述】:
为了在 C 中用printf 打印一个size_t 整数,转换格式器是%zu。
但是,当我将printf 与%zu 一起使用时,通过FFI 调用Haskell 中的C 函数会打印zu 而不是整数。如何解决?
小例子
文件 zu.c
#include <stdio.h>
void printzu(){
size_t x = 666;
printf("x=%zu", x);
}
模块 Lib.hs
{-# LANGUAGE ForeignFunctionInterface #-}
module Lib
where
import Foreign
foreign import ccall unsafe "printzu" printzu' :: IO ()
测试
Prelude> import Lib
Prelude Lib> printzu'
x=zu
【问题讨论】:
-
这是一个过时的 C 标准库的味道,它已经在 haskell 进程中链接了。这是否偶然发生在Windows上?可能是旧的 MSVCRT.DLL ;)
-
您可以通过使用
%lu并明确地将x转换为unsigned long来解决它——在size_t大于unsigned long和你的程序实际上处理的尺寸这么大...... -
@FelixPalmen 是的,Windows。未在 Linux 上测试。
-
好的,我会试试你的解决方法。目前我只是使用
%u而不是%zu,没有强制转换,这可行,但我在我的 C 编辑器中收到了一些乏味的警告。 -
您可以使用一些流程浏览器工具检查在这两种情况下哪些模块是动态链接的。我敢打赌,从 haskell 运行时,您会从 Windows 系统文件夹中获得 MSVCRT.DLL。这个不支持
%zu,至少不通过公开可见的界面。