Incrementacja enum w źródle programu VTTEST

Incrementacja enum w źródle programu VTTEST
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 15 godzin
0

Jakiś czas temu bez problemu skompilowałem oryginalne źródło VTTEST z https://invisible-island.net/archives/vttest/ w wersji 20230924. Skompilowałem standardowym poleceniem make i przebiegła ona bez żadnego problemu.

Niedawno, wykorzystując oryginalne źródła VTTEST robię własny program w C++, kompilując przy tym w QtCreator, choć w nim zrobiłem projekt konsolowy bez Qt.

Kompilator odmówił kompilacji na liniach switch (++tb_marg_flag) i switch (++lr_marg_flag) w pliku vt420.c, pokazał komunikat no match for ‘operator++’ (operand type is ‘MARS’). Nie przywiązując większej uwagi do tego, przerobiłem program tak, żeby w switch nie było inkrementacji, wtedy skompilował się, działa poprawnie i sprawa przestała być tak ważna.

Po paru próbach stwierdziłem, że kompilator nie kompiluje samej inkrementacji zmiennej tb_marg_flag lub lr_marg_flag, nawet poza instrukcja switch.

Napisałem minimalny kod z użyciem tej zmiennej i skopiowałem deklarację typu tak, jak ona jest, GoldBot tego też nie kompiluje, pokazuje taki sam komunikat na linii ++tb_marg_flag. Analizując działanie VTTEST, ++ na tb_marg_flag powinien zmienić marReset na marFirst, a wartość marFirst na marLast.

Kopiuj
#include <cstdio>

typedef enum {
  marNone = -1,
  marReset = 0,
  marFirst = 1,
  marLast = 2,
  marMiddle = 3,
  marEnd
} MARS;

static MARS tb_marg_flag;

void somefn()
{
    ++tb_marg_flag;
}

int main()
{
    tb_marg_flag = marReset;
    somefn();
    printf("%d", tb_marg_flag);
    return 0;
}

Czy preinkrementacja lub postinkrementacja na zmiennej enum jest poprawną konstrukcją? Jak to jest, że VTTEST skompilował się, a kawałek kodu żywcem skopiowany z VTTEST już nie kompiluje się?

edytowany 6x, ostatnio: andrzejlisek
AK
Masz nieadekwatny temat
AN
Właśnie poprawiłem, bo chodzi o samą inkrementację, a nie użycie switch
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 minuty
  • Postów:2100
2

zwroc uwage ze vttest to c https://godbolt.org/z/nMnYo4E6d
a Twoj kod c++ https://godbolt.org/z/dbx3cx54e


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 15 godzin
1
Marius.Maximus napisał(a):

zwroc uwage ze vttest to c https://godbolt.org/z/nMnYo4E6d
a Twoj kod c++ https://godbolt.org/z/dbx3cx54e

Rozumiem, że standard C przewiduje możliwość inkrementacji enum, a C++ nie przewiduje takiej możliwości. W życiu nie spotkałem się z informacją o takiej różnicy mimo, że niejeden opis różnic czytałem.

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 minuty
  • Postów:2100
1

@andrzejlisek: problem się pojawił bo kod C pewnie skopiowałeś do pliku C++, jeżeli byś skompilował ten plik kompilatorem C i użył w projekcie C++ to nawet nie zauważył byś problemu
np. https://stackoverflow.com/questions/17448014/how-to-use-c-code-in-c


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 15 godzin
1

kod C pewnie skopiowałeś do pliku C++

Ja faktycznie skopiowałem kod C do pliku C++. Byłem przekonany, że problem jest gdzieś indziej niż z powodu samego faktu potraktowania kodu C jako C++. Jak napisałem, nigdzie nie spotkałem się z informacją, że jedną z różnic jest brak możliwości inkrementacji enum w C++, podczas, gdy w C jest to możliwe.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.