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

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

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 ++, и я никогда не сталкивался с таким предупреждением на любом другом компиляторе, который я использовал. Есть ли какое-то разумное объяснение того, почему это предупреждение может быть полезным, например, есть ли конкретный случай, когда это предупреждение может указывать на ошибку программирования?

0

Решение

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

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

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

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

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

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)
-3

По вопросам рекламы [email protected]