如何解决C字符串标准库,memset和废弃的volatile关键字
我在xc32编译器(基于gcc的微控制器编译器,不是开源)上收到这样的警告。
modem_uart.c:66:5:警告:传递'memset'的参数1会丢弃 指针目标类型的“ volatile”限定符[默认启用]
代码如下:
import re
line = 'akhgvfalfhda.dhgfa.lidhfalihflaih**Thing1**aoufgyafkugafkjhafkjhflahfklh**Thing2**dlfkhalfhafli...'
_legal = ['thing1','thing2','thing3','thing4']
exp = re.compile(r'|'.join(_legal),re.IGNORECASE)
exp.findall(line)
>>> ['Thing1','Thing2']
有人可以解释为什么编译器会丢弃volatile吗?
解决方法
您的平台不提供保证遵守memset
的任何保证的volatile
函数。因此,为了调用memset
,编译器必须丢弃volatile
上的rxbuf
限定符。
您可能应该编写自己的memset
实现,该实现应尊重您期望volatile
为您提供的任何保证。 This answer为memcpy
提供了一个解决类似问题的工具。如果没有这样的保证,那就摆脱volatile
。
memset
标准中的规范具有以下声明:
void *memset(void *s,int c,size_t n);
第一个参数未声明为volatile void *s
。因此,不能保证遵守访问volatile
数据的额外限制。每次致电memset()
都会将目标视为不稳定,这会对性能造成不必要的影响。
如果需要这些保证,应将memset()
调用替换为显式循环。
for (int i = 0; i < MODEM_UART_RXBUF_SIZE; i++) {
rxbuf[i] = 0;
}
如果您需要在代码中的多个位置使用此代码,则可以将其放入volatile_memset()
函数中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。