You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:40:02