我也在STM32社区论坛上发布了同样的问题,但没有得到答案.
我在启用了C++ 14的项目中使用stm32 HAL库.它发出了我无法摆脱的以下警告.
../platform/stm32/l4/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h:735:57:
警告:转换为void将不会访问类型为'volatile uint32_t {aka volatile long unsigned int}'UNUSED(tmpreg); \
当调用__GPIOX_CLK_ENABLE()或__HAL_RCC_GPIOX_CLK_ENABLE时,会发生这种情况.
有没有人能够摆脱上述警告,使HAL源代码完好无损.
或任何想法可以做什么.
目前的警告级别是-Wall.
我遇到了l4和f4系列代码的上述问题.
示例代码:
int main(void)
{
HAL_Init();
__GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
for (;;)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
Run Code Online (Sandbox Code Playgroud)
罪魁祸首是__GPIOB_CLK_ENABLE()
,它扩展到以下(在ST驱动程序中).
#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \
__IO uint32_t tmpreg; \
SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN); \
/* Delay after an RCC peripheral clock enabling */ \ …
Run Code Online (Sandbox Code Playgroud) 我想用作std::span
函数的模板模板参数。gcc 似乎接受以下代码,但 clang 拒绝。
#include <iostream>
#include <span>
#include <vector>
std::vector v{1,2,3,4,5,6};
template <template <typename> class S>
S<int> GetSpan()
{
return v;
}
int main()
{
auto x = GetSpan<std::span>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会出现这种情况吗?
在最近的一篇文章中,我意识到在分配结构变量时,与将结构类型传递给sizeof()
. 这基本上是因为前者比后者更能适应代码更改。
这表明,在下面的代码中,方法 1被认为是比方法 2更好的做法。
typedef struct X_ {
int x;
int y;
int z;
} X;
int main() {
X* obj1 = malloc(sizeof(*obj1)); // ----> method 1
X* obj2 = malloc(sizeof(X)); // ----> method 2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是,obj1
在方法 1 中取消引用的有效性如何?Inside malloc
,obj1
仍然是未构造/未初始化的内存,这表明对obj1
内部发生的解除引用sizeof()
不应该是有效的。
让我猜猜是什么使方法 1有效。这是因为sizeof()
编译器将取消引用的编译时操作obj1
转换为方法 2吗?
有人可以参考相关的C标准详细说明这个的技术有效性吗?