希艾斯迪恩 2015-04-05 14:33 采纳率: 0%
浏览 1924

gcc 用函数指针初始化结构数组的问题

由于最近需要编译libhybris,遇到了奇怪的问题,简而言之,可以概括如下,对于程序

int func(int a);
int func2(int a);

int func(int a)
{
return a+1;
}

int func2(int a)
{
return a*4;
}

typedef struct _
{
int tmp;
void * addr; // 1处:此处如果改称int 或者uint32_t
short tmp2;
} ptr_st;

static ptr_st p[] = {
{
tmp:1,
addr:& func, //2处:同时这里加上强制类型转换,转为int或者uint32_t

            },
            { 
                tmp2:5,
                addr:& func2,//2处:同时这里加上强制类型转换,转为int或者uint32_t
                tmp:2 ,
            },
        };

如上程序,在gcc 4.6.3中,是没有问题的
但是,如果在1处改成int、并且在2处加强制类型转换,则编译不通过,错误为:
“初始值设定元素不是常量”
所以我很奇怪,无论类型到底是void *还是int\uint32_t,函数指针的值到底知不知道,这件事都应该是确定的,而与接受它的变量无关。
非要把函数指针赋给整形变量这件事,也是没办法的办法,我看了一下,因为libhybris需要初始化Elf32_Sym这个结构体,而里面的地址就是以Elf32_Addr(即uint32_t)类型定义的。另一方面,libhybris也不是我写的,有可能程序没问题,只是编译选项选的不对的情况,所以如果知道如何编译libhybris的话,也请多指教,谢谢!

  • 写回答

1条回答 默认 最新

  • oyljerry 2015-04-05 15:30
    关注

    (int)&func
    是这样吗

    评论

报告相同问题?

悬赏问题

  • ¥50 comsol稳态求解器 找不到解,奇异矩阵有1个空方程返回的解不收敛。没有返回所有参数步长;pid控制
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功