I / O 핀을 정의하는 가장 좋은 방법은 무엇입니까?


9

나는 같은 정의를 읽었다.

const int ledPin = 9;

그리고 또한

#define ledPin 9

나는 그 정의가

int ledPin = 9;

Arduino 프로그램에서 이것을 여러 번 보았지만 변경하지 않으려는 경우 나쁜 습관입니다 (보통 그렇지 않을 것입니다). 다른 두 가지 중 어느 쪽이 선호됩니까?

답변:


6

#define ledPin 9선호됩니다. 그렇게 int ledPin = 9;하면 int사용할 때마다 값이 사용되는 메모리를 할당하게됩니다 ledPin. #define메모리를 할당하지 않는다는 점에서 다릅니다. 라는 메모리가 없습니다 ledPin. 컴파일하기 전에 코드에서 모든 "ledPin"(문자열 이외의)은로 대체됩니다 9. 그래서 기본적으로

digitalWrite(ledPin);

된다

digitalWrite(9);

장점 #define: 메모리를 절약하고 실행 전에 모두 ledPin대체 하므로 프로세서 시간이 절약됩니다.9

작은 코드에서는 실제로 중요하지 않습니다 ...


임베디드 컴파일러는 실제로 너무 나빠서 사용할 때 지속적인 폴딩을하지 const int않습니까?
Chuu

1
내가 아는 한 @chuu는 avr에 gcc를 사용합니다. 따라서 거의 확실하게 최적화되어야합니다. 여기에 대한 답변은 C ++의 우수 사례에 대한 많은 이해를 보여주지 않습니다
chbaker0

3
C ++에서는 const int ledPin = 9;다른 두 가지 옵션보다 선호됩니다. int어딘가에 포인터를 정의 하면 예외를 제외하고 메모리를 할당하지 않습니다 .
jfpoilpret

Const int는 @jfpoilpret 메모리를 할당합니다. #define은 메모리의 이름이 아닌 표현식의 상징적 인 이름을 기억하지 않습니다.

이 링크 cplusplus.com/forum/beginner/28089 를 확인하고 직접 확인하십시오. 그렇지 않으면 Arduino IDE로 검사를 수행하십시오 : const 및 #define으로 데이터 크기를 확인하십시오.
jfpoilpret

4

엄밀히 말하면, #define접근 방식은 약간 적은 메모리를 사용합니다. 차이는 일반적으로 작습니다. 메모리 사용량을 줄여야 할 경우 다른 최적화가 훨씬 효과적 일 것입니다.

사용에 유리한 주장 const int형식 안전성 입니다. 변수로 해당 핀 번호를 참조하는 곳마다 얻는 데이터 유형을 정확히 알고 있습니다. 이를 사용하는 코드에 의해 암시 적으로 또는 명시 적으로 승격 / 변환 될 수 있지만 매우 명확한 방식으로 동작해야합니다.

대조적으로,의 값은 #define해석에 개방적입니다. 대부분의 시간, 아마 당신에게 전혀 문제를 일으키지 않을 것입니다. 값의 유형이나 크기에 대해 가정하는 코드가있는 경우 약간 조심해야합니다.

개인적으로 메모리를 절약해야 할 필요가 없다면 거의 항상 타입 안전을 선호합니다.


Peter의 답변을 읽을 때까지 #define 캠프에있었습니다. 이번 주말에 누가 코드를 리팩토링 할 것인지 알고 있습니다. ;)
linhartr22

2

아마도 가장 좋은 방법은
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보다 높고 더 큰 부호있는 정수로 승격되는 동안 부호 확장되는 경우 문제 가있을 있지만 (전혀 확실하지는 않지만) 핀 번호로는 발생하지 않을 수 있습니다.


-1

뿐만 아니라

const int ledPin = 9;

RAM을 사용하지만이 경우 digitalWrite(uint8_t, uint8_t)1 바이트 인수 만 필요 하므로 필요한 것보다 많은 RAM을 사용 하며 int는 일반적으로 2 바이트 (컴파일러에 따라 다르지만 일반적인)입니다. #define에서 리터럴에 명시 적 유형을 제공 할 수 있습니다.

#define ledPin ((int)9) 

특정 유형이 필요한 함수 인수와 같은 컨텍스트에서 (함수가 제대로 프로토 타입 되었기 때문에) 유형이 일치하지 않으면 내재적으로 캐스트되거나 오류 메시지가 표시됩니다.


@DrivebyDownvoter, 이유에 대해 언급 하시겠습니까?
JRobert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.