C++ multicharacter

Nie wiedziałem, że C i c++ pozwalają multicharacter literal: nie " c "(typu int W C i char W C++), ale "tralivali" (typu int!)

enum
{
    ActionLeft = 'left',
    ActionRight = 'right',
    ActionForward = 'forward',
    ActionBackward = 'backward'
};

Standard mówi:

C99 6.4.4. 4p10: "wartość an stała znaku integer zawierająca więcej niż jeden znak (np. "ab"), lub zawierające znak lub escape sekwencja, która nie mapuje do znak wykonania jednobajtowego, jest implementacja-zdefiniowana."

Znalazłem są one szeroko stosowane w silniku C4 . Ale przypuszczam, że nie są one bezpieczne, gdy mówimy o serializacji niezależnej od platformy. Thay może być mylące również dlatego, że wyglądają jak ciągi. Jaki jest więc zakres zastosowania multicharakterystyki, czy są one do czegoś przydatne? Czy są one w C++ Tylko dla kompatybilności z kodem C? Czy są one uważane za złą funkcję jako Goto operator czy nie?

Author: topright gamedev, 2010-10-18

5 answers

Nie wiem, jak szeroko To jest używane, ale "implementation-defined" jest dla mnie wielką czerwoną flagą. O ile wiem, może to oznaczać, że implementacja może zignorować oznaczenia znaków i po prostu przypisać normalne wartości przyrostowe, jeśli chce. Może to zrobić coś "ładniejszego", ale nie można polegać na tym zachowaniu we wszystkich kompilatorach (lub nawet wersjach kompilatorów). Przynajmniej "goto" ma przewidywalne (jeśli niepożądane) zachowanie...

To i tak moje 2c.

Edit: on "implementation-defined": {]}

Z Bjarne Stroustrup ' S C++ Glossary :

Implementacja zdefiniowana-aspekt Semantyka C++, która jest zdefiniowana dla każda implementacja zamiast określone w normie dla każdego wdrożenie. Przykładem jest wielkość int (który musi mieć co najmniej 16 bitów, ale mogą być dłuższe). Unikaj implementation defined behavior o ile to możliwe. : undefined. TC++PL C. 2

Również...

Undefined-aspekt języka C++ semantyka, dla której nie ma rozsądnych zachowanie jest wymagane. Przykładem jest dereferencja wskaźnika z wartością zero. Unikaj niezdefiniowanego zachowania. Zobacz też również: implementacja zdefiniowana. TC++PL C. 2.

Uważam, że to oznacza, że komentarz jest poprawny: powinien przynajmniej się skompilować, chociaż nic poza tym nie jest określone. Zwróć również uwagę na porady zawarte w definicji.

 17
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-18 16:51:57

Ułatwia wybieranie wartości z zrzutu pamięci.

Przykład:

enum state { waiting, running, stopped };

Vs.

enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };

Zrzut pamięci po następującej instrukcji:

s = stopped;

Może wyglądać tak:

00 00 00 02 . . . .

W pierwszym przypadku vs:

73 74 6F 70 s t o p

Korzystanie z literałów wielocharakterystycznych. (oczywiście to, czy mówi "stop", czy "pots" zależy od kolejności bajtów)

 24
Author: Ferruccio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-11 15:39:14

Cztery literały znaków, widziałem i używałem. Mapują na 4 bajty = jedno 32-bitowe słowo. Jest to bardzo przydatne do celów debugowania, jak wspomniano powyżej. Mogą być używane w instrukcji switch/case z ints, co jest miłe.

To (4 znaki) jest dość standardowe (tj. obsługiwane przez GCC i VC++ co najmniej), chociaż wyniki (rzeczywiste wartości skompilowane) mogą się różnić w zależności od implementacji.

Ale ponad 4 znaki? Nie użyłbym.

Aktualizacja: ze strony C4: "dla naszych prostych działań, po prostu podamy wyliczenie niektórych wartości, co odbywa się w C4 przez podanie stałych czteroznakowych". Więc używają znaków 4 literałów, jak to było w moim przypadku.

 5
Author: jv42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-19 08:52:58

W projekt specyfikacji C++14 N4527 sekcja 2.13.3, pozycja 2:

... Zwykły literał zawierający więcej niż jeden znak C-char jest literałem wieloznacznym. Literał wielocharakterowy lub zwykły literał zawierający pojedynczy znak c-char, który nie jest reprezentowalny w zestawie znaków wykonania, jest obsługiwany warunkowo, ma typ int i ma wartość zdefiniowaną przez implementację.

Poprzednie odpowiedzi na twoje pytanie dotyczyły głównie prawdziwych maszyn to wspierało wielokanałowe literały. W szczególności, na platformach, gdzie int mA 4 bajty, czterobajtowy multicharacter jest w porządku i może być używany dla wygody, jak na przykładzie ferrucio zrzutu mem. Jednak, ponieważ nie ma gwarancji, że to będzie działać lub działać w ten sam sposób na innych platformach, użycie liter wielocharakterystycznych powinno być przestarzałe dla programów przenośnych.

 3
Author: Zhongming Qu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-02 23:45:42

Literały Wielocharakterowe pozwalają określić int wartości za pomocą równoważnej reprezentacji w postaci znaków. Przydatne dla enum, kodów i znaczników FourCC oraz parametrów szablonów innych niż typ. Dzięki literałowi wielocharakterowemu kod FourCC może być wpisany bezpośrednio do źródła, co jest przydatne.

Implementacja w gcc jest opisana na https://gcc.gnu.org/onlinedocs/cpp/Implementation-defined-behavior.html . Zauważ, że wartość jest obcięta do rozmiaru typu int, więc 'efgh' == 'abcdefgh' Jeśli Twoje ints mają szerokość 4 znaków, chociaż gcc wyda ostrzeżenie o przepełnionym literale.

Niestety, gcc wyda ostrzeżenie dla wszystkich literałów wielo-znakowych, jeśli -pedantic zostanie przekazana, ponieważ ich zachowanie jest zdefiniowane w implementacji. Jak widać powyżej, możliwe jest, że równość dwóch liter wielo-znakowych może się zmienić, jeśli zmienisz implementacje.

 2
Author: kacey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-20 20:50:55