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
- 1129 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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]
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
Ha jól emlékszem itt az a hiba, hogy nincs az enum -nak valódi neve:
enum foo {
...
} BUBU;
Így a #define -al rögzítettel nem fogja összekeverni, cserébe többet kell gépelni BUBU.egy
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Biztos vagy benne, hogy ilyet lehet? Eddigi ismereteim szerint a "."-tal struktúra, union és c++-ban class elemek hivatkozhatók. A gcc/g++ egészen biztosan panaszkodik a BUBU.egy formára.
- A hozzászóláshoz be kell jelentkezni
a clang-6.0.1 és a pcc-1.1.0 is anyázik.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Valami zavar lesz az erőben. Mintha C-ben nem lenne "var". Az olyan pacalos.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
A wikipedia linkrol lett kimasolva, de a TypeScript-rol szolo szakaszbol. :)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A Rust-ban van keményen enumnév::érték módon hivatkozva. Másik enum cimkéjével így nem tudod félrecímkézni.
Mellesleg a Rust enum-ja ennél többet tud, amolyan cimkézett union-szerűségre is alkalmas, amit szintén csak cimkehelyesen tudsz alapból feldolgozni.
- A hozzászóláshoz be kell jelentkezni
Ilyen nincs a C/C++-ban. C++-ban van olyan, hogy "enum class foo { egy = 1 };", és akkor úgy kell hivatkozni az egy-re, hogy "foo::egy".
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
> 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?
- A hozzászóláshoz be kell jelentkezni
"Komolyabb helyeken a #define használata emiatt tilos is, mert nagyon könnyű öngyilkos aknákat csinálni vele."
Nem tudom mik azok a komolyabb helyek, de ajánlom a Linux kernel kódjában a következő parancsot futtatni :)
grep -Ir define| wc -l
- A hozzászóláshoz be kell jelentkezni
Komolyabb helyeken a #define használata emiatt tilos is, mert nagyon könnyű öngyilkos aknákat csinálni vele.
Kíváncsivá teszel. Példa?
- A hozzászóláshoz be kell jelentkezni
Egy rakat probléma van a define-nal. Pl., itt van egy:
#define square(x) ((x)*(x))
int x = 2;
int s = square(x++);
Itt az x kétszer lesz megnövelve.
- A hozzászóláshoz be kell jelentkezni
Ez egy meglehetőse ismert probléma - legalábbis jobb könyvekben / doksikban / oktatáson külön felhívják rá a figyelmet.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Ez egy makró, nem konstans definíció.
A makrók használata veszedelmes, nem szeretem, inkább "inline" és a modern kompájlerek megoldják.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni