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 answermemcpy提供了一个解决类似问题的工具。如果没有这样的保证,那就摆脱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()函数中。