C enum kérdés

Fórumok

Szabad egy enum konstans értékenek megadásakor ugyanabban az enum-ban korábban definiált konstanst használni? Buta példa:

enum foo {
        ONE = 1,
        TWO = ONE + ONE  /* szabad ilyet? */
};

Az a gyanúm, hogy szabad, de teljesen elbizonytalanítottam magam. Mindenesetre

gcc -ansi -pedantic

örömmel lefordítja.

A vonatkozó specben azonban nem látok semmi olyat, ami ezt explicit engedné, vagy amibe legalább bele tudnám magyarázni.
http://c0x.coding-guidelines.com/6.7.2.2.html

Hozzászólások

Amit nem tilos azt szabad. De nem logikus. Az emum egy felsoroló konstans. Ha valami két vizet is jelentene a bitmask-ban, akkor lehet összeadni: 64+128. De itt is inkább a konstans számot írnám bele. Ha elmozgatom az elemeket nem biztos hogy kettő hatvanyra fognak mozogni, azaz nem automatizalhato az érték kiosztása. Szerintem.

Szabad, es rendszeresen ki is hasznaljak ezt sok helyen. Pl. keyboard firmwareben - vagy nagyjabol barhol, ahol ranget akarsz enummal lefedni - gyakori az ilyesmi:


enum foo {
  BLAH_FIRST = 0xc000,
  BLAH_LAST = BLAH_FIRST + 15,
  FOO_FIRST,
  FOO_LAST = FOO_FIRST + 31,
  SAFE_START
}

--
|8]

Érdekes, hogy az enum-ban szereplő cimke rokon a #define-olt cimkével. Viszont veszélyes is.

- ha előtte van #define, akkor reklamál, hogy már van ilyen cimke
- ha később van #define, simán átdefiniálja

Ez főleg akkor gáz, ha az enum definició közös header fájlból érkezik és az egyik C-ben véletlenül azonos nevű cimke lesz utána definiálva.
Ekkor a két függvény, amely a közös enum definicióból táplálkozik, jól szétdivergál. Ez nem az a könnyen megtalálható bug.

Meginogtam, googleztam:
C Enumeration Declarations
Sajnos nincs példa a "workday.friday" hivatkozásra :(
Kipróbálni most nem tudom.
SZERK: Találtam ilyesmit:
Enumerated type

enum Cardsuit {Clubs = 1, Diamonds, Hearts, Spades};
var c: Cardsuit = Cardsuit.Diamonds;

* Én egy indián vagyok. Minden indián hazudik.

Asszem az első próbálkozásodban 2 dolgot kavartál.


enum akarmi { egy = 1, ketto };
typedef enum { harom = 3, negy } masvalami;

masvalami valami = harom;

int
main() {
printf("%d,%d\n", egy, valami );
}

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Végre megtaláltam a K&R 1194 SE kiadásomat - az ANSI C -ben nincs "külön neve" az "enum" -al képezett sorozatnak.
Az enum a #define nem a preprocesszornak szól.

Arról már nem is beszélve, hogy az eredeti kérdés nem is erről szólt.

* Én egy indián vagyok. Minden indián hazudik.

A #define-t precomplier dolgozza fel, "buta" stringmanipuláció alapú lecseréléssel dolgozik, a konkrét számértéket írja be mindenhova, ahol megtalálja a kulcsszó előfordulását.

A #define ezért mindennél "erősebb", mivel a fordítás előtti lépésben fut le. Ha ilyen van:

#define ONE 1

enum {
ONE
}

Akkor az a precompiler után ez lesz, és ez C nyelven értelmetlen, ez lesz a fordítási hiba:

enum {
1
}

Érdemes néha ránézni a precompiler kimenetére, amit a legtöbb fordító ki tud adni magából. Ez bár nehezen olvasható, de legalább meg lehet benne találni az ilyen hibákat: pl gcc -E.

Komolyabb helyeken a #define használata emiatt tilos is, mert nagyon könnyű öngyilkos aknákat csinálni vele.

> Komolyabb helyeken a #define használata emiatt tilos is, mert nagyon könnyű öngyilkos aknákat csinálni vele.

Szar lehet fejlesztéskor kihagyni a teljes libc-t. (Értem, mit akarsz sugallni, de azért magas lapda volt.)

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?