小编aep*_*aep的帖子

使用C++ 14及更高版本的stm32 hal库警告

我也在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)

c++ embedded stm32 c++14

10
推荐指数
1
解决办法
1625
查看次数

std::span 作为模板模板参数不能用 clang 编译

我想用作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)

有人可以解释为什么会出现这种情况吗?

https://godbolt.org/z/Ks9M5oqKc

c++ templates clang clang++ c++17

7
推荐指数
2
解决办法
242
查看次数

取消引用未初始化的指针以传递给 sizeof()

在最近的一篇文章中,我意识到在分配结构变量时,与将结构类型传递给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标准详细说明这个的技术有效性吗?

c malloc pointers sizeof language-lawyer

4
推荐指数
1
解决办法
209
查看次数

标签 统计

c++ ×2

c ×1

c++14 ×1

c++17 ×1

clang ×1

clang++ ×1

embedded ×1

language-lawyer ×1

malloc ×1

pointers ×1

sizeof ×1

stm32 ×1

templates ×1