搜索
bottom↓
回复: 13

用结构体做菜单,父子菜单相互包含对方指针,怎么编译?

[复制链接]

出130入129汤圆

发表于 2014-3-1 23:46:17 | 显示全部楼层 |阅读模式
本帖最后由 68336016 于 2014-3-2 02:43 编辑

我之前都是全局变量里将各个菜单项定义好,然后通过一个函数对其初始化。
没事想精简下,于是就模仿常见的做法,在定义时候就初始化。
但是怎么看都无法通过编译的,父子菜单项你中有我,我中有你,谁先都会说对方没定义。

可是这种写法网上很常见,理论上应该能用的。

  1. #include "stdafx.h"

  2. struct MenuItem
  3. {
  4.         char * MenuString;
  5.         struct MenuItem *Children;        //子节点
  6.         struct MenuItem *Parent;        //父节点
  7. };

  8. struct MenuItem MainMenu[1] = //主菜单,简单起见只定义1个
  9. {
  10.         {"MainMenu",SubMenu, NULL},
  11. };

  12. struct MenuItem SubMenu[2] =         //子菜单
  13. {
  14.         {"SubMenu_1",NULL, MainMenu},
  15.         {"SubMenu_2",NULL, MainMenu},
  16. };

  17. int main(int argc, _TCHAR* argv[])
  18. {
  19.         return 0;
  20. }
复制代码



搞清楚了,我一开始是用VC,加了下面两行也不行,是因为中括号里有数字,不过我看别人的代码中括号都是带数字。
struct MenuItem MainMenu[1];
struct MenuItem SubMenu[2];

不过在MDK里面,中括号有没有数字一样能编译过去。
可能各种编译环境不同,反正中括号里不加数字,在VS2005,GCC,MDK环境下都能正常编译通过


  1. struct MenuItem
  2. {
  3.         char * MenuString;
  4.         struct MenuItem *Children;        //子节点
  5.         struct MenuItem *Parent;        //父节点
  6. };

  7. struct MenuItem MainMenu[];
  8. struct MenuItem SubMenu[];

  9. struct MenuItem MainMenu[1] = //主菜单
  10. {
  11.         {"MainMenu",SubMenu, NULL},
  12. };

  13. struct MenuItem SubMenu[2] =         //子菜单
  14. {
  15.         {"SubMenu_1",NULL, MainMenu},
  16.         {"SubMenu_2",NULL, MainMenu},
  17. };

  18. int main(int argc, _TCHAR* argv[])
  19. {
  20.         return 0;
  21. }
复制代码



阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-3-1 23:55:00 | 显示全部楼层
先声明...

出130入129汤圆

 楼主| 发表于 2014-3-1 23:58:46 | 显示全部楼层
本帖最后由 68336016 于 2014-3-2 00:05 编辑


如果先声明,就没法通过大括号一次性初始化了
-------------------------------------------------------------------
补充:如果先声明,在MDK倒是能编译通过,一开始我在VC里面是无法编译的

出0入0汤圆

发表于 2014-3-2 00:09:55 | 显示全部楼层
68336016 发表于 2014-3-1 23:58
如果先声明,就没法通过大括号一次性初始化了
------------------------------------------------------- ...

哈哈,记得C与指针里面好像有一段讲到这,先睡觉,明天我也去补补课

出0入0汤圆

发表于 2014-3-2 00:19:29 | 显示全部楼层
68336016 发表于 2014-3-1 23:58
如果先声明,就没法通过大括号一次性初始化了
------------------------------------------------------- ...

我觉得你这里谈不上初始化,这里就是个定义...
至于为啥不通过,我也是MDK临时拉出来编译了一下确认了给你的答案,大晚上的不想开VS了...

出0入442汤圆

发表于 2014-3-2 00:33:09 来自手机 | 显示全部楼层
Vc是不支持嵌套定义的。你只能用void型指代。

出130入129汤圆

 楼主| 发表于 2014-3-2 01:09:13 | 显示全部楼层
本帖最后由 68336016 于 2014-3-2 02:27 编辑
wye11083 发表于 2014-3-2 00:33
Vc是不支持嵌套定义的。你只能用void型指代。


修改:在VC中加了后正常编译,在GCC中也正常通过,开始VC中不能通过因为中括号里面有数字,但是MDK不影响。
struct MenuItem MainMenu[];
struct MenuItem SubMenu[];

出0入0汤圆

发表于 2014-3-2 01:29:39 | 显示全部楼层

出0入0汤圆

发表于 2014-3-2 01:50:10 | 显示全部楼层
在VC中这样试试:
  1. extern struct MenuItem MainMenu[1];
  2. extern struct MenuItem SubMenu[2];
复制代码

出130入129汤圆

 楼主| 发表于 2014-3-2 02:00:22 | 显示全部楼层
本帖最后由 68336016 于 2014-3-2 02:09 编辑
eduhf_123 发表于 2014-3-2 01:50
在VC中这样试试:



加了extern后VC可以编译,也可以不要中括号里面的数字
  1. extern struct MenuItem MainMenu[];
  2. extern struct MenuItem SubMenu[];
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-2 02:29:23 | 显示全部楼层
68336016 发表于 2014-3-2 02:00
加了extern后VC可以编译,也可以不要中括号里面的数字

GCC里也试试?

出130入129汤圆

 楼主| 发表于 2014-3-2 02:37:57 | 显示全部楼层
本帖最后由 68336016 于 2014-3-2 02:39 编辑


GCC跟VS2005有点不太相同
GCC中,中括号有没有数字不影响,但是这2行位置得在结构体定义后。
VS2005中,中括号里不能有数字,但是这2行位置随意。
不用加extern,中括号也别加数字,这2行放到结构体定义后,在各个编译器应该都没问题(VS2005,GCC,MDK都试过了)

struct MenuItem MainMenu[];
struct MenuItem SubMenu[];

  1. #include "stdio.h"

  2. struct MenuItem
  3. {
  4.         char * MenuString;
  5.         struct MenuItem *Children;        //子节点
  6.         struct MenuItem *Parent;        //父节点
  7. };

  8. struct MenuItem MainMenu[];
  9. struct MenuItem SubMenu[];

  10. struct MenuItem MainMenu[1] = //主菜单
  11. {
  12.         {"MainMenu",SubMenu, 0},
  13. };

  14. struct MenuItem SubMenu[2] =         //子菜单
  15. {
  16.         {"SubMenu_1",0, MainMenu},
  17.         {"SubMenu_2",0, MainMenu},
  18. };

  19. int main(int argc, char* argv[])
  20. {
  21.         printf("ok\n");
  22.         return 0;
  23. }
复制代码

出0入0汤圆

发表于 2014-3-2 02:45:12 | 显示全部楼层
68336016 发表于 2014-3-2 02:37
GCC跟VS2005有点不太相同
GCC中,中括号有没有数字不影响,但是这2行位置得在结构体定义后。
VS2005中, ...

刚才回帖时还想说结构体定义跟变量声明的顺序还有声明数组不指定大小的问题来着。

出130入129汤圆

 楼主| 发表于 2014-3-2 02:52:57 | 显示全部楼层
eduhf_123 发表于 2014-3-2 02:45
刚才回帖时还想说结构体定义跟变量声明的顺序还有声明数组不指定大小的问题来着。

  ...

我这 结构体 定义 是从自己工程文件里的头文件拷贝出来的,所以就忘记顺序这事了。
不过结构体这样声明一下,还是第一次用。
以前都是其他变量extern引用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表