分享到:文章主题: 帮忙看个C语言常量字符串问题
spadger楼主
imdx
身份
用户
文章
12125
星座
天秤座
积分
51461
等级
楠木(12)

发信人: spadger (imdx), 信区: Circuit
标  题: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 14:14:01 2020), 站内
  
update
------------------------------------------
可以用宏来定义字符串,解决一致性问题,编译器也可以优化成同一个地址,
57155.com_【官方首页】-澳门威尼斯人这样相当于绕过编译器的类型检查。但只是绕过了问题,依然无法解释AC5和gcc的行为。
  
编译结果更让人惊掉下巴,改用宏实现以后,AC5和AC6均可以编译通过
AC5编译完尺寸占用0x9c40,AC6是0xcbd0,都是最大尺寸优化。后者比前者大了30%多。
  
AC5.06 -O3优化编译结果:
  
Load Region LR_IROM1 (Base: 0x08002000, Size: 0x00009c40, Max: 0x0000e000, ABSOLUTE, COMPRESSED[0x00009a18])
  
AC6.13.1 -O3优化直接报空间不足,-Oz优化编译结果:
  
Load Region LR_IROM1 (Base: 0x08002000, Size: 0x0000cbd0, Max: 0x0000e000, ABSOLUTE, COMPRESSED[0x0000ca58])
  
  
57155.com_【官方首页】-澳门威尼斯人MDK中遇到的问题,AC6正常编译,AC5报错。简化以后如下:
------------------------------------------
#include <stdio.h>
const char * const str1 = "str1";
const char * str2 = str1;
int main() {
     printf("%s - %s\n", str1, str2);
     return 0;
}
------------------------------------------
57155.com_【官方首页】-澳门威尼斯人str1是个指向常量字符串的常量指针,用它来初始化另外一个常量字符串。
本意是想定义两个指向同一个静态常量字符串的常量指针。目的是减小代码体积。
  
MDK 编译器V6.13.1,C99模式,正常编译正常运行,无错误无警告。
MDK 编译器V5.06,C99模式,报错:
     error:  #28: expression must have a constant value
     V5.06似乎不认为str1是个常量,打开编译器的GNU扩展,一样报错。
  
57155.com_【官方首页】-澳门威尼斯人换到Linux下试了下,gcc报错,g++正常,编译器版本7.4.0,好奇怪。
  
  
--
  
※ 修改:·spadger 于 Jan 14 17:11:28 2020 修改本文·[FROM: 36.45.168.*]
※ 来源:·水木社区 tfrqsb.com·[FROM: 36.45.168.*]

返回顶部
dismoon第1楼
伐开心要包包
身份
用户
文章
2669
星座
双鱼座
积分
18493
等级
灵樨(8)

发信人: dismoon (伐开心要包包), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:25:34 2020), 站内
  
你把声明第一个“变量”的关键字const去掉试试
有的编译器用了const的确就不分配内存单元,而是把它变成代码一部分,自然也就不存在地址了
  
要我写,我估计是这么写的
  
#include <stdio.h>  
char *str1[] = "str1";  
char *str2 = str1[0];  
int main() {  
      printf("%s - %s\n", str1[], str2);  
      return 0;  
}
  
  
【 在 spadger 的大作中提到: 】
57155.com_【官方首页】-澳门威尼斯人: MDK中遇到的问题,AC6正常编译,AC5报错。简化以后如下:
  
--
※ 修改:·dismoon 于 Jan 14 15:33:41 2020 修改本文·[FROM: 117.63.26.*]
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 117.63.26.*]

返回顶部
lanmp第2楼
-_-!谁的大腿
身份
用户
文章
10070
积分
64162
等级
椽桷(13)

发信人: lanmp (-_-!谁的大腿), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:29:09 2020), 站内
  
你这都是变量啊。常量就应该在ROM里啊
【 在 dismoon 的大作中提到: 】
: 你把声明第一个“变量”的关键字const去掉试试
: 有的编译器用了const的确就不分配内存单元,而是把它变成代码一部分,自然也就不存在地址了
: 要我写,我估计是这么写的
: ...................
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 106.38.10.*]

返回顶部
dismoon第3楼
伐开心要包包
身份
用户
文章
2669
星座
双鱼座
积分
18493
等级
灵樨(8)

发信人: dismoon (伐开心要包包), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:31:10 2020), 站内
  
  
楼主不是就要变量吗,不是变量哪里来的地址指针啊
  
【 在 lanmp 的大作中提到: 】
: 你这都是变量啊。常量就应该在ROM里啊
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 117.63.26.*]

返回顶部
lanmp第4楼
-_-!谁的大腿
身份
用户
文章
10070
积分
64162
等级
椽桷(13)

发信人: lanmp (-_-!谁的大腿), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:33:45 2020), 站内
  
常量为什么不能有地址指针?
【 在 dismoon 的大作中提到: 】
: 楼主不是就要变量吗,不是变量哪里来的地址指针啊
:  
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 106.38.10.*]

返回顶部
dismoon第5楼
伐开心要包包
身份
用户
文章
2669
星座
双鱼座
积分
18493
等级
灵樨(8)

发信人: dismoon (伐开心要包包), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:36:07 2020), 站内
  
  
有的编译器对常量的处理方式是直接放代码里面,不在执行内存里面。
不在内存里面=没有地址
  
【 在 lanmp 的大作中提到: 】
: 常量为什么不能有地址指针?
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 117.63.26.*]

返回顶部
lanmp第6楼
-_-!谁的大腿
身份
用户
文章
10070
积分
64162
等级
椽桷(13)

发信人: lanmp (-_-!谁的大腿), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:40:19 2020), 站内
  
你说的代码是ROM么,哪个编译器的常量不放在ROM里?不太明白不在内存里面=没有地址,ROM不能访问么?
【 在 dismoon 的大作中提到: 】
57155.com_【官方首页】-澳门威尼斯人: 有的编译器对常量的处理方式是直接放代码里面,不在执行内存里面。
: 不在内存里面=没有地址
:  
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 106.38.10.*]

返回顶部
dismoon第7楼
伐开心要包包
身份
用户
文章
2669
星座
双鱼座
积分
18493
等级
灵樨(8)

发信人: dismoon (伐开心要包包), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:43:44 2020), 站内
  
  
我这么解释你可能更容易理解一点
假设有代码1
int a=100;
int b=a;
然后编译器就会先弄4个字节的地址出来存放a,然后让b得到a对应的地址里面的值;
  
然后有代码2
const int a=100;
int b=a;
好了,代码2不同的编译器有不同的编译方法,有的比较浪费的编译器,会以然按照代码1的方法编译,只是后继代码中不允许改变a的值。而有的比较节约的编译器,索性就不分配4个字节给a了,相对的,第一句代码在这种编译器眼里,就等同于
#define a 100
  
这样子,你写int b=a自然没有问题,因为等于是int b=100;
当时当你用int *b=a的时候,就会出错,因为100不是一个变量,自然没有地址
  
  
【 在 lanmp 的大作中提到: 】
: 常量为什么不能有地址指针?
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 117.63.26.*]

返回顶部
dismoon第8楼
伐开心要包包
身份
用户
文章
2669
星座
双鱼座
积分
18493
等级
灵樨(8)

发信人: dismoon (伐开心要包包), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:49:08 2020), 站内
  
  
哦,你的本意是减小代码长度,我的办法可能舍本求末了
容我再三思一下.....
  
【 在 spadger 的大作中提到: 】
57155.com_【官方首页】-澳门威尼斯人: MDK中遇到的问题,AC6正常编译,AC5报错。简化以后如下:
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 117.63.26.*]

返回顶部
lanmp第9楼
-_-!谁的大腿
身份
用户
文章
10070
积分
64162
等级
椽桷(13)

发信人: lanmp (-_-!谁的大腿), 信区: Circuit
标  题: Re: 帮忙看个C语言常量字符串问题
发信站: 水木社区 (Tue Jan 14 15:56:13 2020), 站内
  
你挺会举例子,如果不是100而是ABCDEFG呢?你准备怎么给b赋值?你最后那个报错难道不是类型不匹配的问题么?
【 在 dismoon 的大作中提到: 】
: 我这么解释你可能更容易理解一点
: 假设有代码1
: int a=100;
: ...................
  
--
  
※ 来源:·水木社区 http://tfrqsb.com·[FROM: 106.38.10.*]

返回顶部

页面底部区域 foot.htm