硬汉嵌入式论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: eric2013
收起左侧

[MDK] MDK AC6使用sizeof求结构体数组大小,编译报错

  [复制链接]

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 2024-7-22 13:42:34 | 显示全部楼层
所以确定不会有多个文件使用的全局变量 直接加上static
回复

使用道具 举报

23

主题

335

回帖

404

积分

高级会员

积分
404
发表于 2024-7-22 15:15:19 | 显示全部楼层
LinY 发表于 2024-7-22 13:42
所以确定不会有多个文件使用的全局变量 直接加上static

还是不太建议,几个文件直接引用或者间接包含头文件还好,太多了会在每个包含这个头文件的源文件中都定义这么一个常量,会造成text段膨胀。如果编译器能够将多个同样的优化为一个还好。
回复

使用道具 举报

4

主题

391

回帖

403

积分

高级会员

积分
403
发表于 2024-7-22 16:34:00 | 显示全部楼层
tovinz 发表于 2024-7-22 15:15
还是不太建议,几个文件直接引用或者间接包含头文件还好,太多了会在每个包含这个头文件的源文件中都定义 ...

编译器优化是不可能的,include的本质是把文件给复制进来


以下为测试代码
bsp.h
[C] 纯文本查看 复制代码
static const PLLI2SPSC_T g_tPLLI2SPSC[] ={...} // 省略


bsp.c
[C] 纯文本查看 复制代码
BSP_Printf("bsp.c g_tPLLI2SPSC add = %X", &g_tPLLI2SPSC);
BSP_Printf("bsp.c sizeof g_tPLLI2SPSC = %d", sizeof(g_tPLLI2SPSC));


main.c
[C] 纯文本查看 复制代码
BSP_Printf("main.c g_tPLLI2SPSC add = %X", &g_tPLLI2SPSC);
BSP_Printf("main.c sizeof g_tPLLI2SPSC = %d", sizeof(g_tPLLI2SPSC));


结果如下,g_tPLLI2SPSC为各自文件的私有变量。地址不重复
Snipaste_2024-07-22_16-21-59.png


回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 2024-7-22 17:34:35 | 显示全部楼层
建议变量都尽量定义在.c文件中,如果引用比较多的话对应.h 文件可以用extern的方式声明下 供其他地方调用,不多其他.c文件自己去extern下
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-23 13:25:54 | 显示全部楼层
1. 想用sizeof(不完整类型数组),就必须用头文件static定义
2. 其他场景就是头文件extern
根据使用场合选择
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-23 15:53:32 | 显示全部楼层
cctv180 发表于 2024-7-22 16:34
编译器优化是不可能的,include的本质是把文件给复制进来

感觉&g_tPLLI2SPSC这个是临时指针变量的地址,&g_tPLLI2SPSC[0]应该是固定地址
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 2024-7-23 16:36:12 | 显示全部楼层

[C] 纯文本查看 复制代码

x.c:
const PLLI2SPSC_T g_tPLLI2SPSC[]=
{
        //参数范围192-432   2-15       1-32          
    /* Fs  PLLI2S_N,  PLLI2S_Q  PLLI2S_DivQ  MCKDIV */
        {8000 ,  256,       5,         25,          0},  /* MCLK = 2.048MHz,   实际采样率 = 8000KHz    */
        {16000,  213,       2,         26,          0},         /* MCLK = 4.096153MHz,实际采样率 = 16000.6KHz */
        {32000,  213,       2,         13,          0},         /* MCLK = 8.192307MHz,实际采样率 = 32001KHz   */
        {48000,  258,       3,         7,           0},         /* MCLK = 12.28571MHz, 实际采样率 = 47991KHz   */
        {96000,  344,       2,         7,           0},  /* MCLK = 24.57142MHz, 实际采样率 = 95982KHz   */
        {192000, 393,       2,         4,           0},  /* MCLK = 49.125MHz,   实际采样率 = 191894KHz  */
         
        {11020,  429,       2,        19,           2},  /* MCLK = 2.822368MHz, 实际采样率 = 11.024KHz */
        {22050,  429,       2,        19,           1},  /* MCLK = 5.644737MHz, 实际采样率 = 22.049KHz */
        {44100,  429,       2,        19,           0},  /* MCLK = 11.28947MHz, 实际采样率 = 44.099KHz */
};

y.c:
extern PLLI2SPSC_T g_tPLLI2SPSC[];

// 不能这么写么

回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-7-23 16:51:03 | 显示全部楼层
fxyc87 发表于 2024-7-22 11:38
你这个图片是什么软件?感觉这么优雅呢?

vscode+eide,别跟我学,追求优雅是工程师大忌
回复

使用道具 举报

4

主题

391

回帖

403

积分

高级会员

积分
403
发表于 2024-7-23 23:30:04 | 显示全部楼层
h_007 发表于 2024-7-23 15:53
感觉&g_tPLLI2SPSC这个是临时指针变量的地址,&g_tPLLI2SPSC[0]应该是固定地址

&g_tPLLI2SPSC[0]结果也一样的,注意日志地址80开头的地址在flash空间范围。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
 楼主| 发表于 2024-7-24 07:50:29 | 显示全部楼层
LinY 发表于 2024-7-23 16:36
[mw_shl_code=c,true]

x.c:

这么写的话,其它文件调用sizeof会提示楼主位的问题。
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2024-10-25 10:43:15 | 显示全部楼层
AC6,优化等级都设的那个选项?我接手的一个GD32L233的工程是-O0,用AC6.16能编译过,用AC6.22就编译不过,提示no space,而且有些地方AC6.16不提示Warning,AC6.22提示Warning,有些地方AC6.16提示Warning,AC6.22直接提示Error。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-4-12 14:23:52 | 显示全部楼层
刚才也遇到同样的问题搜到了这个帖子,可以在定义结构体数组的文件中定义一个函数返回sizeof的值,别的文件中调用这个函数。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 23:50 , Processed in 0.311642 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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