2011-01-09 3 views
6

이 질문은 끝났으므로 열거 형을 사용하는 것이 좋습니다. 그러나, 나는 enums가 최종 코드에서 어떻게 컴파일되는지 궁금해 .- #define은 문자열 대체 일 뿐이지 만 열거 형은 컴파일 된 바이너리에 아무것도 추가하지 않습니까? 아니면 둘 다 그 단계에서 동급입니까? 펌웨어와 메모리를 작성하는 것이 매우 제한적이라면 #defines를 사용하는 데 아무리 작은 장점이 있겠습니까?임베디드 환경에서 #define vs enum (컴파일 방법)

감사합니다.

편집 : 아래 설명에 의해, 임베디드에 의해 요청 된대로, 나는 디지털 카메라를 의미합니다.

답변 해 주셔서 감사합니다. 나는 열거 형이다!

+2

"임베디드"는 Nexus S에서부터 항공 전자 시스템에 이르는 모든 것을 의미 할 수 있습니다. 의미있는 대답을 원하면 버전을 좁혀 야합니다 (어떤 칩, 어떤 컴파일러, 어떤 버전?). 나는 응답자들에게'const '와 비슷한 대우를 받아야한다고 동의한다. –

+1

@Matthew : C++에 대해 생각하고 있다고 생각합니다. C에서'# define'과'enum'은 상수 표현식을 만들 수 있지만'const' 변수는 결코 상수 표현식이 아니며, 접근하면 실제 코드 크기와 성능상의 불이익을 받게 될 것입니다. –

+0

@R, 당신은 C99의 const 표현식이 아닌'const'에 대해 옳았습니다. (그리고 이것에 대해 읽어 볼 필요가 있습니다.) 그러나 간단한 경우 컴파일러는 여전히 메모리 할당을 피할 수 있습니다. 예를 들어,'const int a = 1;'을 헤더에 넣고 main에'int b = a;'를 넣으면 컴파일러는'a '에 메모리를 할당하지 않을만큼 똑똑 할 수 있습니다. –

답변

10

모두 표준의 용어 상수 표현은, 그래서 그들은 어떤 제정신 컴파일러에 의해 컴파일 시간에 완벽하게 평가되어야 "한다." 그것은 다른 코드를 생성하기 위해 악성 병적 인 컴파일러를 취할 것입니다.

+1

그들은 표준의 용어에서 * 상수 식 * 그러나 정수 상수 식 *이 아닙니다. 차이점은 여기에서 중요합니다. 왜냐하면 첫 번째 예를 들어 주소 상수가 또한 적합하기 때문입니다. 나중에있을 때만 형식 선언과 다른 'enum'상수의 정의에 나타날 수 있습니다. 그리고 배열 길이로 사용하면 일반 배열과 VLA의 차이를 만듭니다. –

5

enum은 궁극적으로 정수입니다. 컴파일러는 const과 마찬가지로 값을 전파합니다.

+1

'enum' 값은 * 상수 표현식 *입니다. 반면에'const' 변수는 (C에서) 정적 초기화,'case' 레이블, ...에 사용할 수 없습니다. 'enum' 값은 컴파일 타임 상수이고,'const' 변수는 런타임 상수입니다 (언어의 관점에서 볼 때 컴파일러는'const' 변수에 대한 상수 전파를 자유롭게 할 수 있습니다). – Christoph

4

다른 방식으로 프로파일 링이나 측정 없이는 말할 수 없습니다.

그러나 괜찮은 컴파일러는 큰 차이점을 나타내지 않을 것입니다. 또한, 읽기 쉽고, 유형 안전성이있는 코드를 효율적이고 읽을 수없는 코드보다 선호해야합니다.

  1. 가 실제로 효율성 향상
  2. 당신이 프로파일에 의해 병목 것으로 나타났다 변경하고 프로그램의 일부가 필요합니다 : 당신은 두 가지를 입증 할 때까지 가독성을 통해 효율을 최적화 시작하지 마십시오 .
+1

전적으로 당신과 동의합니다 불필요한 최적화! 방금 프로젝트에 참여했고 #define이 사용 되었기 때문에 효율적인 이유가 있는지 궁금합니다. –

+0

이 경우에는 프로파일 링과 측정을 할 필요가 없습니다. 생성 된 어셈블리는 동일해야합니다. –

+0

@Brooks 예. 이를 반영하기 위해 편집 됨. –