希艾斯迪恩 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
    是这样吗

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)