由于最近需要编译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的话,也请多指教,谢谢!