user-0 提问: 结构体内函数指针以及const常量的赋值问题

回复:
user: user-1
content: #include <stdio.h> struct A {   const unsigned int a;   void (*set)(void); };  void set_enable(void) {    printf("set_enable!\n"); }    int main() {   struct A b=   {    9,    set_enable   };   return 0; }

user: user-2
content: 引用 20 楼 miaoxiangbiancheng 的回复:引用 19 楼 z1179675084 的回复:这个和const常量赋值有什么关系呢？const常量是结构体内的成员 自己写的http://blog.csdn.net/z1179675084/article/details/12617711

user: user-3
content: const常量 不能赋值，只能初始化。  如果结构体含有常量，则常量部分，C只能初始化整个结构的时候，初始化常量，  C++还可以在构造函数的初始化表里初始化常量。 C++结构体也可以像类一样，有成员函数，包括析构函数，构造函数。 不过，有构造函数的结构体，初始化方式和类一样。和C的结构体就不一样了。  C++11，又添加了，新的初始化方式，即象C,又像C++，其实都不像。  常量只有一次初始化的机会。 C的结构体含有常量，无法直接整体赋值。 C++如果有，拷贝运算符，可以整体的，对非常量成员部分赋值。

user: user-0
content: 引用 19 楼 z1179675084 的回复:这个和const常量赋值有什么关系呢？const常量是结构体内的成员

user: user-4
content: dummy我建议你定义的一个宏 比如，#define dummy 0xAAAAAAAA

user: user-5
content: 引用 3 楼 miaoxiangbiancheng 的回复:[quote=引用 1 楼 pbdwadr 的回复:] struct A b={    9,    set_enable, }; 或者用gcc编译（c语言，不是c++的规范）你的这种方式是有效的，解决对一个成员赋值的问题，谢谢了。   现在面临的另一个问题是，对含有多个成员的结构体中的任意少数接个成员赋值，其他不进行初始化，如何处理？[/quote]  直接指定给成员变量赋值即可。 struct A b; b.set = set_enable;

user: user-0
content: 引用 12 楼 drlsdrls 的回复:哪个不用你就把哪个设为dummy不就行了 struct A b={    dummy,//point    9,//const };dummy表示什么?    可以表明我不使用它？

user: user-4
content: 哪个不用你就把哪个设为dummy不就行了 struct A b={    dummy,//point    9,//const };

user: user-0
content: 引用 8 楼 drlsdrls 的回复:struct A b={    9,    set_enable, };  既然已经是const了，那只能初始化，不能赋值。如果你只想对第二个变量初始化或者赋值，那么第一个就随便给一个值，比如你define一个dummy放到那里就行了没错，const变量只能初始化，如果它是在成员中的第一个位置，初始化是容易的，不是的话就很麻烦了。比如上面例子中的const unsigned int a;放在第二个位置，假设第一个成员 void (*set)(void);不需要使用，那么该如何初始化？

user: user-0
content: 引用 9 楼 buyong 的回复:为什么吧一个宏（常数）赋值给一个void*这是代码移植过程中碰到的，属于bootloader（LK）的代码，我也是编译过程中发现问题的。但发现问题了就要解决啊，所以特来请教大家如何处理。

user: user-6
content: 为什么吧一个宏（常数）赋值给一个void*

user: user-4
content: struct A b={    9,    set_enable, };  既然已经是const了，那只能初始化，不能赋值。如果你只想对第二个变量初始化或者赋值，那么第一个就随便给一个值，比如你define一个dummy放到那里就行了

user: user-0
content: 引用 5 楼 pbdwadr 的回复:[quote=引用 3 楼 miaoxiangbiancheng 的回复:] [quote=引用 1 楼 pbdwadr 的回复:] struct A b={    9,    set_enable, }; 或者用gcc编译（c语言，不是c++的规范）你的这种方式是有效的，解决对一个成员赋值的问题，谢谢了。   现在面临的另一个问题是，对含有多个成员的结构体中的任意少数接个成员赋值，其他不进行初始化，如何处理？[/quote]  直接指定给成员变量赋值即可。 struct A b; b.set = set_enable;[/quote]此种方法可行。  但如果使用宏对结构体成员赋值，会出现expression must be a modifiable lvalue 是何原因呢？ 在头文件中有如下声明： struct pll_vote_clk { 	unsigned long rate;  	void *const en_reg; 	const uint32_t en_mask;  	void *const status_reg; 	const uint32_t status_mask;  	struct clk *parent; 	struct clk c; }; 在源文件中先定义，在赋值初始化： static struct pll_vote_clk gpll0_clk_src; gpll0_clk_src.en_reg       = (void *) APCS_GPLL_ENA_VOTE; APCS_GPLL_ENA_VOTE是个宏， #define APCS_GPLL_ENA_VOTE                   (CLK_CTL_BASE + 0x1480) 出现了编译错误，如上面所说的。  请问，该如何赋值，或者对值进行什么调整呢？  特别是带有const的变量如何赋值。

user: user-3
content: 抱歉 4)用 已经初始化的 变量，常量，给变量，常量赋值。 应该是： 4)用 已经初始化的 变量，常量，给变量赋值。

user: user-2
content: 这个和const常量赋值有什么关系呢？

user: user-2
content: 那四楼也说过了，不过第三种方法有特别需要注意的地方，比如结构体里面有指针。你直接复制相当于两个结构体中的指针指向了同一片内存，而动态申请的内存肯定会在程序中释放，假如其中的一个释放了，那另一个的指针指向就会有问题了。

user: user-7
content: 结构体或者类的初始化只能跳过后面的参数, 而不能跳过前面的.  struct A b={1};//跳过第二个. struct A a={1,set_enable}; //全部赋值.  如果想跳过, 就只能一个一个赋值.  struct A b; b.a = xxx; b.set = set_enable;

user: user-0
content: 引用 15 楼 z1179675084 的回复:这是搞啥呢？一楼说的很清楚了，你那个方法是gcc里面支持的，你用dev-c++编译器试试，肯定能过这个我知道，因为我也单独在Gcc里试过了，使用相同的服务器进行，是没问题的。     实际在工程中使用的是交叉编译器，使用相同的服务器进行编译，其他人编译LK没有问题，（LK中含有我要移植到boot_images上的CLK相关代码），而我移植过程中却出现这类的编译错误。       所以想找下是否有其他可行的替代方法。

user: user-2
content: 这是搞啥呢？一楼说的很清楚了，你那个方法是gcc里面支持的，你用dev-c++编译器试试，肯定能过

user: user-3
content: 引用 楼主 miaoxiangbiancheng 的回复:在头文件head.h中声明了结构体： struct A {   const unsigned int a;   void (*set)(void); };  在源文件source.c中先定义了函数，且定义了结构体并赋值： void set_enable(void) {    printf("set_enable!\n"); }  struct A b={    .a=9,    .set=set_enable, }; 编译的时候会出错，指出.a ,  .set这两行Error:  #29: expected an expression 说明，这是在工程中的一个编译错误，经过测试在头文件和源文件中就进行如上操作都会报这样的错误。 有谁碰过请帮忙指出错误，谢谢！  1) 初始化：  struct A b={    9,set_enable, };  2)用 已经初始化的 变量，常量，初始化变量，常量。 struct A a =b; 3) 直接对成员变量赋值。 struct A  c; c.a=9; c.set =set_enable; 4)用 已经初始化的 变量，常量，给变量，常量赋值。 struct A  d; d = b;  //======================= //  这个在pascal里，见过这种方法初始化。  //  //  struct A b={    .a=9,    .set=set_enable, };