【问题标题】:c language - can I use const uint32_t instead of #definec语言 - 我可以使用 const uint32_t 而不是#define
【发布时间】:2016-07-29 08:56:29
【问题描述】:

在下面的代码中,我可以使用const uint32_t PERIPH_BASE_ADDR = 0x40000000; 代替#define 吗?

#ifndef MEMORY_MAP_H_
#define MEMORY_MAP_H_

#include <stdint.h>

// Base address for devices on the STM32F10x
#define PERIPH_BASE_ADDR ((uint32_t)0x40000000) // Peripheral base address in the alias region

// Peripheral memory map
#define AHB1_BASE_ADDR    ((uint32_t)(PERIPH_BASE_ADDR + 0x20000)) // Advanced High-performance Bus 1

#endif /* MEMORY_MAP_H_ */

【问题讨论】:

  • 你试过了吗?...
  • 如果放在头文件中,应该使用static const
  • @blatinox:定义不应进入头文件!这是 C 语言,const 的语义与 C++ 不同。

标签: c microprocessors


【解决方案1】:

当然可以。在头文件中,放

static const uint32_t PERIPH_BASE_ADDR = (uint32_t) 0x40000000;
static const uint32_t AHB1_BASE_ADDR = (uint32_t) (PERIPH_BASE_ADDR + 0x20000);

#define 指令是一个预处理器指令;预处理器甚至在编译器看到它之前就用它们的主体替换了这些宏。将其视为对源代码的自动搜索和替换。

const 变量声明在语言中声明了一个实际变量,您可以使用它......好吧,就像一个真正的变量:获取它的地址,传递它,使用强制转换,转换它等等。

哦,性能:也许您认为避免声明变量可以节省时间和空间,但是对于任何合理的编译器优化级别都不会有任何区别,因为常量值已经在编译时被替换和折叠。但是你获得了类型检查和让调试器知道你的代码的巨大优势,所以真的没有理由不使用 const 变量。

【讨论】:

  • 您可以使用编译选项(-g3 用于 gcc)在调试器中获取有关宏的一些信息。
  • @blatinox 是的,正确
  • C 没有像 C++ 这样的常量。 Thie 将生成不同的代码并具有不同的语义。对于嵌入式系统,这是错误的方法。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 2016-03-17
  • 2014-01-24
  • 1970-01-01
  • 2011-04-30
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多