SGH C ++: message de diagnostic en point-virgule supplémentaire – objective?

Dans le compilateur GHS , si vous avez plusieurs points-virgules dans une ligne sans instruction intermédiaire, cela génère un message de diagnostic (avertissement). Par exemple:

void myfunc() { }; // warning #381-D: extra ';' ignored. 

Cela ne semble pas être une situation très courante, mais cet avertissement est également émis après le prétraitement. Ainsi, les événements suivants génèrent également l’avertissement (lors de la compilation dans l’édition):

 #if _DEBUG #define DEBUG_VAR(x) x #else #define DEBUG_VAR(x) #endif void myfunc() { } // global variable, used only in debug DEBUG_VAR(int x); // warning #381-D: extra ';' ignored. 

Je me rends compte qu’il existe des moyens simples de contourner ce problème dans ce cas, il ne s’agit que d’un exemple illustratif. Il existe de nombreuses autres situations avec le pré-processeur dans lesquelles vous pourriez vous retrouver avec une construction similaire.

De toute évidence, le code est légal c ++ et je n’ai jamais rencontré un tel message d’avertissement sur un autre compilateur que j’ai utilisé. Existe-t-il une explication raisonnable quant à l’utilité de cet avertissement? Par exemple, existe-t-il un cas spécifique dans lequel cet avertissement pourrait indiquer une erreur de programmation?

Mon exemple préféré est le “demi-soleur persistant”. Nous en avions un à mon dernier lieu de travail. Plus de deux fois il écrivit:

 for (i=0; i 

... et a ensuite été empêché que son tableau n'a pas été initialisé. Et pire , il avait un bug dans lequel une variable aléatoire était corrompue.

Si vous ne pouvez pas le repérer, ça ne serait pas bien si le compilateur le faisait?

Cela dit, je conviens que souvent un point-virgule parasite est "apprivoisé" - mais la logique qui permet à un compilateur de cracher l'erreur à un endroit ne discrimine pas à d'autres ...

Existe-t-il une explication raisonnable quant à l’utilité de cet avertissement? Par exemple, existe-t-il un cas spécifique dans lequel cet avertissement pourrait indiquer une erreur de programmation?

La plupart des cas, sûrement?

Depuis le ; n’a pas de sens, soit vous l’avez écrit sous forme de redondance (et vous devez alors demander “pourquoi?”) l’parsingur et fait le ; sembler redondant alors que ce n’était pas le cas.

Cependant, je ne peux penser à aucun exemple.

Mais cette macro serait mieux écrite comme suit:

 #include  #ifndef NDEBUG #define DEBUG_VAR(T, N) std::common_type::type N; #else #define DEBUG_VAR(T, N) #endif void myfunc() {} // global variable, used only in debug DEBUG_VAR(int, x)