나는 같은 정의를 읽었다.
const int ledPin = 9;
그리고 또한
#define ledPin 9
나는 그 정의가
int ledPin = 9;
Arduino 프로그램에서 이것을 여러 번 보았지만 변경하지 않으려는 경우 나쁜 습관입니다 (보통 그렇지 않을 것입니다). 다른 두 가지 중 어느 쪽이 선호됩니까?
나는 같은 정의를 읽었다.
const int ledPin = 9;
그리고 또한
#define ledPin 9
나는 그 정의가
int ledPin = 9;
Arduino 프로그램에서 이것을 여러 번 보았지만 변경하지 않으려는 경우 나쁜 습관입니다 (보통 그렇지 않을 것입니다). 다른 두 가지 중 어느 쪽이 선호됩니까?
답변:
#define ledPin 9
선호됩니다. 그렇게 int ledPin = 9;
하면 int
사용할 때마다 값이 사용되는 메모리를 할당하게됩니다 ledPin
. #define
메모리를 할당하지 않는다는 점에서 다릅니다. 라는 메모리가 없습니다 ledPin
. 컴파일하기 전에 코드에서 모든 "ledPin"(문자열 이외의)은로 대체됩니다 9
. 그래서 기본적으로
digitalWrite(ledPin);
된다
digitalWrite(9);
장점 #define
: 메모리를 절약하고 실행 전에 모두 ledPin
대체 하므로 프로세서 시간이 절약됩니다.9
작은 코드에서는 실제로 중요하지 않습니다 ...
const int ledPin = 9;
다른 두 가지 옵션보다 선호됩니다. int
어딘가에 포인터를 정의 하면 예외를 제외하고 메모리를 할당하지 않습니다 .
엄밀히 말하면, #define
접근 방식은 약간 적은 메모리를 사용합니다. 차이는 일반적으로 작습니다. 메모리 사용량을 줄여야 할 경우 다른 최적화가 훨씬 효과적 일 것입니다.
사용에 유리한 주장 const int
은 형식 안전성 입니다. 변수로 해당 핀 번호를 참조하는 곳마다 얻는 데이터 유형을 정확히 알고 있습니다. 이를 사용하는 코드에 의해 암시 적으로 또는 명시 적으로 승격 / 변환 될 수 있지만 매우 명확한 방식으로 동작해야합니다.
대조적으로,의 값은 #define
해석에 개방적입니다. 대부분의 시간, 아마 당신에게 전혀 문제를 일으키지 않을 것입니다. 값의 유형이나 크기에 대해 가정하는 코드가있는 경우 약간 조심해야합니다.
개인적으로 메모리를 절약해야 할 필요가 없다면 거의 항상 타입 안전을 선호합니다.
아마도 가장 좋은 방법은
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
또는
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
C ++ (및 기타)의 상수에 대한 일반적인 관행에 따라 이름이 대문자입니다. 이것은 자체적으로 RAM을 사용해서는 안되며, 사용 당 약 1 바이트의 프로그램 메모리를 사용해야합니다.
그러나 숫자가 127보다 높고 더 큰 부호있는 정수로 승격되는 동안 부호 확장되는 경우 문제 가있을 수 있지만 (전혀 확실하지는 않지만) 핀 번호로는 발생하지 않을 수 있습니다.
뿐만 아니라
const int ledPin = 9;
RAM을 사용하지만이 경우 digitalWrite(uint8_t, uint8_t)
1 바이트 인수 만 필요 하므로 필요한 것보다 많은 RAM을 사용 하며 int는 일반적으로 2 바이트 (컴파일러에 따라 다르지만 일반적인)입니다. #define에서 리터럴에 명시 적 유형을 제공 할 수 있습니다.
#define ledPin ((int)9)
특정 유형이 필요한 함수 인수와 같은 컨텍스트에서 (함수가 제대로 프로토 타입 되었기 때문에) 유형이 일치하지 않으면 내재적으로 캐스트되거나 오류 메시지가 표시됩니다.
const int
않습니까?