2011-06-10 3 views
1

Extending이 질문에, 나는 이것은 비효율적입니까? 그들은으로 "가정"하고로

#include <stdio.h> 
enum E{ A, B, C } ; 

#define inc(enVal) (*((int*)&enVal))++ 

int main() 
{ 
    E t = A ; 
    inc(t) ; 
    printf("t %d\n", t) ; 
} 

지금 어, t이 enum'd 형 E의 변수입니다, 내 enumed 발을 사용하고 싶었, 나는 매크로 inc이 이 값은 t의 값을 1 씩 증가시킵니다.

int t을 사용하는 것보다이 매크로 (그리고 아마도 플래그 검사와 같은 다른 매크로)가 그렇게 효율적이지 않습니까?

+14

"비효율적"으로 "잘못됨"이 아닙니다. –

+0

int를 증가 시키려면 왜 사용하지 않습니까? 또한 해체를보고 실제로 진행되는 것을 확인하십시오. – Andrei

+0

이것은 정의 된 동작입니까? –

답변

11

아니요, 효율성이 떨어지지는 않을 것입니다. 그러나 그것은 엄청나게, 끔찍하게, 틀릴 것입니다. 제발, 하지마.

아, 특히 열거 형의 백업 유형이 정의되지 않았으므로 일부 컴파일러에서는 int 크기보다 더 작게 컴파일 될 수 있습니다.

0

나는 이것이 표준의 엄격한 앨리어싱 규칙을 위반하는 것이 아니라, 그것이 C에 대해 올바르게 작동하지 않을 것이라는 것을 확신한다. 너 정말로 무엇을하려고하는거야? 실제로 SENSE가 값을 증가 시키는가?

상태 시스템을 구현하려는 경우 vector/어레이 조회 테이블을 가지고 새 상태로 이동하는 것이 좋습니다.

int 대신에 열거 형 값이 연속적이라고 가정 할 수 있습니까?

5

어서,이 열거에 대한 과부하가 괜찮은지 :

E& operator ++ (E& x) 
{ 
    x = E((int)x + 1); 
    return x; 
} 

in action를 참조하십시오.

+0

그건 그가하는 일이 아니야. –

+1

@Neil : 왜 안 되니? 그의 버전은 증분 이전에 int 형을 반환하고 광산은 증분 이후에 올바른 유형을 반환합니까? – ybungalobill

+0

@nbt 이것은 위조 매크로 대신에 * 수행해야 할 작업입니다. – Quuxplusone