问题描述
我在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()
函数中。