/ / Makro jako przypadek w przypadku przełącznika nie działa w c [duplikat] - c, makra, instrukcja przełącznika

Makro jako przypadek w przypadku przełącznika nie działa w c [duplikat] - c, makra, instrukcja-switch

Robiłem projekt uczelni. Napotkałem problem tutaj jest zbyt uproszczoną wersją tego problemu ..

#include <stdio.h>

#define h1 2
#define h2 3
#define h3 4

const int ar[] = {h1,h2,h3};
int main(int argc, char const *argv[]) {
for (size_t i = 0; i < 3; i++) {
switch (i) {
case ar[i]:
printf("yes!!!!!!!!");
}
}
return 0;
}

Pokazuje błąd. Nie rozumiem. Proszę wyjaśnić ... Dziękuję Ci.

Odpowiedzi:

1 dla odpowiedzi № 1

case wyrażenia muszą być stałe czasowe kompilacji. Ekspresja ar[i] nie jest stałą czasu kompilacji, jest oceniana w czasie wykonywania.

Możesz to rozwiązać przez pewne refaktoryzacje:

switch (ar[i])
{
case h1:
printf("got h1n");
break;
}

Innym sposobem jest oczywiście użycie if oświadczenia, jak w

if (i == ar[i]) { ... }

4 dla odpowiedzi nr 2

W języku C etykiety przypadków muszą być stałymi czasowymi kompilacji. w twoim kodzie ar [i] nie kompiluje stałej czasowej.

C11 6.8.4.2 Instrukcja zamiany (paragraf 3):

Wyrazem każdej etykiety przypadku jest stała całkowita wyrażenie i nie ma dwóch wyrażeń stałych w tym samym instrukcja switch powinna mieć tę samą wartość po konwersji.