2016-07-29 4 views
-3

아래 코드에서 #define 대신 const uint32_t PERIPH_BASE_ADDR = 0x40000000;을 사용할 수 있습니까?C 언어 - #define 대신 const uint32_t를 사용할 수 있습니까

#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_ */ 
+3

시도해 보셨습니까? ... – LPs

+2

헤더 파일에 넣으면'static const'를 사용해야합니다. – blatinox

+1

@blatinox : 정의가 헤더 파일에 들어 가지 않아야합니다! 이것은 C이며'const'는 C++과 다른 의미를가집니다. – Olaf

답변

0

물론 가능합니다. 헤더 파일에서 그냥 넣는다

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 변수를 사용하지 않아도됩니다.

+1

gcc에 대해 컴파일 옵션 ('-g3')을 사용하여 디버거의 매크로에 대한 정보를 얻을 수 있습니다. – blatinox

+0

@blatinox Yeah Correct – ninja

+1

C에는 C++와 같은 상수가 없습니다. Thie는 다른 코드를 생성하고 다른 의미를가집니다. 임베디드 시스템의 경우 잘못된 방식입니다. – Olaf