silverviolet 发表于 2021-1-11 21:47

有关结构体内初始化使用 .xxx的情况

本帖最后由 silverviolet 于 2021-1-11 21:48 编辑

      下面是一段关于嵌入式 lcd控制的小段代码,使用环境为visual studio 2019。
struct lcd_controller s3c2440_lcd_controller =
{   .init    = s3c2440_lcd_controller_init,
      .enalbe= s3c2440_lcd_controller_enalbe,
      .disable = s3c2440_lcd_controller_disable,};
提问如下      函数体内.init是函数指针吧,右边的s3c2440_lcd_controller_init是函数的话,函数名相当于地址赋值给左边没错,但是这种初始化在我的visual studio里面很奇怪的发生问题,截图如下,
我不知道应输入表达式算啥错误,之前看了网上大部分的有关结构体先定义后初始化都是类似 struct A.xxx={ xxx=aaa,yyy=bbb}这类,也有看到

[*]
#include "fun_in_struct.h"
[*]
int main(int argc, char **argv) {
[*]
//定义结构体指针或者结构体变量,分别用->和.进行内部元素的使用
[*]
data_store_object *obj;
[*]
char   *word;
[*]
/*方法一:直接定义结构体指针然后用->对结构体变量和函数进行初始化
[*]
word = "nihao";
[*]
obj= calloc(1,sizeof(data_store_object));
[*]
obj->word= word;
[*]
obj->count = 24;
[*]
obj->word_print= WordPrint;
[*]
obj->count_print = CountPrint;
[*]
obj->word_print(obj->word);
[*]
printf("%d\n",obj->count_print(obj->count));
[*]
return 0;
[*]
*/

[*]
/*方法二:直接定义结构体变量然后直接进行初始化,用    变量 = xxx;进行赋值
[*]
data_store_object obj = {
[*]
.word= "nihao",
[*]
.count = 12,
[*]
.word_print= WordPrint,
[*]
.count_print = CountPrint
[*]
};
[*]

我现在很疑惑,.word也是指针啊,如果按照我的输入,为什么会出错呢?
[*]
主要是结构体内成员初始化用 .xxx= yyy就会发生错误,如果用struct a.b={ccc,ddd}这样的就没问题,应该怎样修改才对?作为一个新手真的相当困惑。
[*]

饮水机 发表于 2021-1-11 22:17

本帖最后由 饮水机 于 2021-1-11 22:19 编辑

方法2的这种赋值方式没见过,也没见别人用过。你确定有方法2这种赋值方式吗?

silverviolet 发表于 2021-1-11 22:51

饮水机 发表于 2021-1-11 22:17
方法2的这种赋值方式没见过,也没见别人用过。你确定有方法2这种赋值方式吗?

   方法2是有的,我就是从 韦东山的嵌入式视频s3c2440中有关lcd驱动里看到,然后翻看了他的文档,发现这种初始化方法后看不明白然后百度了下其中某个 CSDN https://blog.csdn.net/perfectionman/article/details/53373664 ,最大的问题是按照这种方式照葫芦画瓢显示E0029错误。

饮水机 发表于 2021-1-11 23:23

本帖最后由 饮水机 于 2021-1-11 23:31 编辑

我测了下,C没问题,可以用,C++不行。你看下源代码,大概率是C写的。C++和C是两种语言,很多地方不一样,不要当一种用。而且C++有严格的类型匹配。这肯定是错的

EnterpriseSolu 发表于 2021-1-12 08:20

.号没有这种用法
object x=new X();
x.SomeMethod();点号的一种用法
或是x->SomeMethod();

初始化,点号不能这样用,这是语法规则,没有道理可讲,熟练就习惯了
data_store_object obj = {

.word= "nihao",

禁闭岛 发表于 2021-1-12 09:04

把你的.cpp文件名后缀改为.c试试

鲸鱼jerry 发表于 2021-1-12 09:18

类型不匹配吗?int* 和void*

xy20200214 发表于 2021-1-12 09:30

gnu c,你使用gcc编译试试

silverviolet 发表于 2021-1-12 20:13

EnterpriseSolu 发表于 2021-1-12 08:20
.号没有这种用法
object x=new X();
x.SomeMethod();点号的一种用法


      书上好像只有结构体成员初始化的时候可以用. 不过那种初始化的. 是struct a.结构体内成员={,,},您说的.号么有这种用法但是下面
初始化,点号不能这样用,这是语法规则,没有道理可讲,熟练就习惯了
data_store_object obj = {

.word= "nihao",


这又是什么情况呢?我实属门外汉请点拨

silverviolet 发表于 2021-1-12 20:14

禁闭岛 发表于 2021-1-12 09:04
把你的.cpp文件名后缀改为.c试试

改了,貌似还是不行,您按我这样输入的能通过吗??
页: [1] 2
查看完整版本: 有关结构体内初始化使用 .xxx的情况