Incrementacja enum w źródle programu VTTEST

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.

#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ę?

2

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

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.

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1