Это неэффективно? - PullRequest
       39

Это неэффективно?

1 голос
/ 10 июня 2011

Расширяя этот вопрос, я хотел использовать мой enumed val, как они "должны" быть,

#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, и у меня есть макрос inc, который увеличивает значение t на 1,

Значит, этот макрос (и, вероятно, другие макросы, подобные ему для проверки флагов) будет гораздо менее эффективен, чем просто использование int t вместо этого?

Ответы [ 3 ]

11 голосов
/ 10 июня 2011

Нет, это не будет менее эффективным.Это будет, однако, невероятно, ужасно, неправильно.Пожалуйста, никогда.

О, тем более что тип поддержки перечислений не определен, и они вполне могут быть скомпилированы до размера, меньшего int в некоторых компиляторах.

5 голосов
/ 10 июня 2011

Да ладно, можно перегрузить перечисления:

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

См. в действии .

0 голосов
/ 10 июня 2011

Я почти уверен, что это нарушает правила строгого псевдонима в стандарте, и не только в том, что он вообще не будет работать правильно для C. Что ты на самом деле пытаешься сделать? На самом ли деле SENSE увеличивает значение?

Скажем, вы пытаетесь реализовать конечный автомат, гораздо лучше просто иметь таблицу поиска vector / array и использовать ее для перехода в новое состояние.

Вы уверены, что не следует использовать вместо него int, если хотите иметь возможность предположить, что перечисленные значения являются последовательными?

...