C头文件初始化变量通过Haskell FFI调用函数时是否仅分配一次?
Haskell FFI调用C全局变量的分配问题
在C语言中,若全局变量在源文件中初始化,其他使用该变量的文件通过extern声明,那么无论调用相关函数多少次,该变量仅分配一次,以此避免跨文件常量重复分配。现在通过Haskell FFI调用这类C函数时,想确认这类全局变量是重复分配还是仅分配一次?如果不是仅分配一次,有哪些简单方法确保其仅分配一次?
以下是对应的示例代码:
示例代码
Main.hs
{-# LANGUAGE ForeignFunctionInterface #-} module Main (main) where foreign import ccall unsafe "cstuff.h cfnc" cfnc :: IO () main :: IO () main = do cfnc cfnc cfnc
cstuff.h
extern int myvar; void cfnc();
cstuff.c
#include "cstuff.h" #include <stdio.h> int myvar = 1; void cfnc() { printf("%i\n",myvar); }
在这个示例中,cfnc被调用3次,需要确认myvar是仅分配一次还是3次?若不是仅一次,如何确保其仅分配一次?
解答
myvar仅会被分配一次,原因如下:
- 在C语言中,
int myvar = 1;是全局变量的定义,这类变量会被分配在程序的静态存储区,在程序启动阶段就完成初始化,生命周期覆盖整个程序运行期间,和函数调用次数完全无关。 - 头文件中的
extern int myvar;只是变量声明,而非定义,它的作用是告诉编译器这个变量在其他文件中已经被定义,不会触发新的内存分配。 - Haskell FFI只是调用编译好的C函数,并不会改变C代码中全局变量的存储机制,所以无论通过FFI调用
cfnc多少次,myvar都只会存在一份实例。
不需要额外做任何操作,你现有的代码已经确保myvar仅分配一次。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

