편집 : microtherion은 특히 메모리 사용에 대한 내 요점 중 일부를 수정하는 훌륭한 대답을 제공합니다.
알다시피 #define
컴파일러가 const
변수를 허용하지 않기 때문에 를 사용해야하는 특정 상황이 있습니다 . 마찬가지로 일부 상황에서는 값 배열이 필요할 때 (예 :의 배열을 가질 수없는 경우) 변수를 사용해야합니다 #define
.
그러나 반드시 하나의 '올바른'답변이 반드시 필요한 것은 아닙니다. 다음은 내가 따르는 몇 가지 지침입니다.
유형 안전
일반적인 프로그래밍 관점에서 const
변수가 일반적으로 바람직합니다 (가능한 경우). 그 주된 이유는 형식 안전입니다.
#define
(처리기 매크로) 직접 복사 문자 코드의 위치에 각 값마다 독립적으로 사용하기. 결과적으로 사용 방법 / 위치에 따라 유형이 다르게 해석 될 수 있기 때문에 모호성이 생길 수 있습니다.
const
변수는 선언에 의해 결정하고, 초기화하는 동안 해결 오직 한 종류입니다. 암시 적으로 유형을 승격시킬 수있는 다양한 상황이 있지만, 다르게 동작하기 전에 명시 적 캐스트가 필요한 경우가 종종 있습니다. 최소한 형식 문제가 발생할 때 컴파일러는 (올바르게 구성된 경우) 더 안정적인 경고를 표시 할 수 있습니다.
가능한 해결 방법은에 명시 적 캐스트 또는 유형 접미사를 포함시키는 것 #define
입니다. 예를 들면 다음과 같습니다.
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
이 방법은 사용 방법에 따라 일부 경우 구문 문제를 일으킬 수 있습니다.
메모리 사용
범용 컴퓨팅과 달리 메모리는 Arduino와 같은 것을 처리 할 때 분명히 중요합니다. const
변수 대 a를 사용 #define
하면 데이터가 메모리에 저장되는 위치에 영향을 미치므로 둘 중 하나를 사용해야 할 수 있습니다.
const
변수는 (보통) 다른 모든 변수와 함께 SRAM에 저장됩니다.
- 사용 된 리터럴 값
#define
은 종종 스케치 자체와 함께 프로그램 공간 (플래시 메모리)에 저장됩니다.
(컴파일러 구성 및 최적화와 같이 무언가를 저장하는 방법과 위치에 정확하게 영향을 줄 수있는 다양한 요소가 있습니다.)
SRAM과 Flash는 서로 다른 제한이 있습니다 (예 : Uno의 경우 각각 2KB와 32KB). 일부 응용 프로그램의 경우 SRAM이 부족하기 때문에 일부 항목을 Flash로 전환하는 것이 도움이 될 수 있습니다. 덜 일반적이지만 그 반대도 가능합니다.
PROGMEM
프로그램 공간 (플래시)에 데이터를 저장하는 동시에 형식 안전성의 이점을 얻을 수 있습니다. PROGMEM
키워드를 사용하여 수행됩니다 . 모든 유형에서 작동하지는 않지만 일반적으로 정수 또는 문자열 배열에 사용됩니다.
설명서에 제시된 일반적인 형식 은 다음과 같습니다.
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
문자열 테이블은 좀 더 복잡하지만 설명서에 자세한 내용이 있습니다.