首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C结构还是函数?

C结构还是函数?
EN

Stack Overflow用户
提问于 2014-04-01 06:49:40
回答 2查看 102关注 0票数 3

我正在尝试理解linux中的kvm代码,遇到了tjis:

代码语言:javascript
运行
复制
    static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = {
[SVM_EXIT_READ_CR0]         = cr_interception,
[SVM_EXIT_READ_CR3]         = cr_interception,
[SVM_EXIT_READ_CR4]         = cr_interception,
[SVM_EXIT_READ_CR8]         = cr_interception,
[SVM_EXIT_CR0_SEL_WRITE]        = emulate_on_interception,
[SVM_EXIT_WRITE_CR0]            = cr_interception,
[SVM_EXIT_WRITE_CR3]            = cr_interception,
[SVM_EXIT_WRITE_CR4]            = cr_interception,
[SVM_EXIT_WRITE_CR8]            = cr8_write_interception,
[SVM_EXIT_READ_DR0]         = dr_interception,
[SVM_EXIT_READ_DR1]         = dr_interception,
[SVM_EXIT_READ_DR2]         = dr_interception,
[SVM_EXIT_READ_DR3]         = dr_interception,
[SVM_EXIT_READ_DR4]         = dr_interception,
[SVM_EXIT_READ_DR5]         = dr_interception,
[SVM_EXIT_READ_DR6]         = dr_interception,
[SVM_EXIT_READ_DR7]         = dr_interception,
[SVM_EXIT_WRITE_DR0]            = dr_interception,
[SVM_EXIT_WRITE_DR1]            = dr_interception,
[SVM_EXIT_WRITE_DR2]            = dr_interception,
[SVM_EXIT_WRITE_DR3]            = dr_interception,
[SVM_EXIT_WRITE_DR4]            = dr_interception,
[SVM_EXIT_WRITE_DR5]            = dr_interception,
[SVM_EXIT_WRITE_DR6]            = dr_interception,
[SVM_EXIT_WRITE_DR7]            = dr_interception,
[SVM_EXIT_EXCP_BASE + DB_VECTOR]    = db_interception,
[SVM_EXIT_EXCP_BASE + BP_VECTOR]    = bp_interception,
[SVM_EXIT_EXCP_BASE + UD_VECTOR]    = ud_interception,
[SVM_EXIT_EXCP_BASE + PF_VECTOR]    = pf_interception,
[SVM_EXIT_EXCP_BASE + NM_VECTOR]    = nm_interception,
[SVM_EXIT_EXCP_BASE + MC_VECTOR]    = mc_interception,
[SVM_EXIT_INTR]             = intr_interception,
[SVM_EXIT_NMI]              = nmi_interception,
[SVM_EXIT_SMI]              = nop_on_interception,
[SVM_EXIT_INIT]             = nop_on_interception,
[SVM_EXIT_VINTR]            = interrupt_window_interception,
[SVM_EXIT_RDPMC]            = rdpmc_interception,
[SVM_EXIT_CPUID]            = cpuid_interception,
[SVM_EXIT_IRET]                         = iret_interception,
[SVM_EXIT_INVD]                         = emulate_on_interception,
[SVM_EXIT_PAUSE]            = pause_interception,
[SVM_EXIT_HLT]              = halt_interception,
[SVM_EXIT_INVLPG]           = invlpg_interception,
[SVM_EXIT_INVLPGA]          = invlpga_interception,
[SVM_EXIT_IOIO]             = io_interception,
[SVM_EXIT_MSR]              = msr_interception,
[SVM_EXIT_TASK_SWITCH]          = task_switch_interception,
[SVM_EXIT_SHUTDOWN]         = shutdown_interception,
[SVM_EXIT_VMRUN]            = vmrun_interception,
[SVM_EXIT_VMMCALL]          = vmmcall_interception,
[SVM_EXIT_VMLOAD]           = vmload_interception,
[SVM_EXIT_VMSAVE]           = vmsave_interception,
[SVM_EXIT_STGI]             = stgi_interception,
[SVM_EXIT_CLGI]             = clgi_interception,
[SVM_EXIT_SKINIT]           = skinit_interception,
[SVM_EXIT_WBINVD]                       = emulate_on_interception,
[SVM_EXIT_MONITOR]          = invalid_op_interception,
[SVM_EXIT_MWAIT]            = invalid_op_interception,
[SVM_EXIT_XSETBV]           = xsetbv_interception,
[SVM_EXIT_NPF]              = pf_interception,

};

我精通C语言,但在任何地方都没有遇到过这一点,我真的很困惑这是一个函数、结构声明还是其他什么。任何帮助都会被欣然接受。

EN

回答 2

Stack Overflow用户

发布于 2014-04-01 06:57:04

这是一个函数指针数组。

它是使用指定的初始化器进行初始化的。

编辑:声明可以理解为--

svm_exit_handlers声明为指向函数的常量指针的静态数组,该函数接受指向struct vcpu_svm的指针并返回int

(您可能会发现http://www.cdecl.org对解析困难的C声明有一定帮助。)

在更通俗的英语中,这意味着这是一个函数指针数组。所指向的函数的形式为int foo(struct vcpu_svm *svm)

编辑:指定的初始值设定项也可能有些混乱。请参阅http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

票数 6
EN

Stack Overflow用户

发布于 2014-04-01 07:01:27

这是一个函数指针数组的初始化,它接受一个(struct vcpu_svm *svm)并返回一个int。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22773698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档