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