GHS C++: дополнительное диагностическое сообщение с точкой с запятой - цель?

В компиляторе GHS, если у вас есть несколько точек с запятой подряд без каких-либо промежуточных операторов, это создает диагностическое сообщение (предупреждение). Например:

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

Это не похоже на очень распространенную ситуацию, но это предупреждение также выдается после предварительной обработки, так что следующее также будет генерировать предупреждение (при компиляции в выпуске):

#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.

Я понимаю, что в этом случае есть простые способы обойти это, это просто иллюстративный пример. Есть много других ситуаций с препроцессором, когда вы можете получить подобную конструкцию.

Очевидно, код является допустимым C++, и я никогда не сталкивался с таким предупреждением на любом другом компиляторе, который я использовал. Есть ли какое-то разумное объяснение того, почему это предупреждение может быть полезным, например, есть ли конкретный случай, когда это предупреждение может указывать на ошибку программирования?

2 ответа

Мой любимый пример - "постоянная точка с запятой". У нас был один на моем последнем месте работы. Более двух раз он писал:

for (i=0; i<MAX; ++i);
    a[i] = 0;

... а затем был заблокирован, что его массив не был инициализирован. И что еще хуже, у него была ошибка, когда случайная величина была повреждена.

Если вы не можете определить это, разве не было бы хорошо, если бы это сделал компилятор?

Сказав все это, я соглашусь, что часто ошибочная точка с запятой является "ручным" - но логика, которая заставляет компилятор выплевывать ошибку в одном месте, не различает в других...

Есть ли какое-то разумное объяснение того, почему это предупреждение может быть полезным, например, есть ли конкретный случай, когда это предупреждение может указывать на ошибку программирования?

Конечно, в большинстве случаев?

Так как ; не имеет смысла, либо вы написали это как избыточность (а затем вы должны спросить "почему?"), либо - и это ключ - вы написали это, случайно удалив какой-то код перед ним, или сделав что-то не так, что запутало парсер и сделал ; Похоже, это было излишним, хотя на самом деле это не так.

Впрочем, я не могу придумать пример с макушки головы.

Но этот макрос лучше написать так:

#include <type_traits>
#ifndef NDEBUG
   #define DEBUG_VAR(T, N) std::common_type<T>::type N;
#else
   #define DEBUG_VAR(T, N)
#endif

void myfunc()
{}

// global variable, used only in debug
DEBUG_VAR(int, x)
Другие вопросы по тегам