vs2010 C4353 почему это не ошибка - PullRequest
1 голос
/ 21 октября 2011

Я столкнулся с этим сегодня, если и после просмотра обнаружил, что все это все действительные утверждения, генерирующие C4353.Мое единственное предположение, что это старый способ сделать noop в C. Почему это не ошибка.Когда бы вы использовали это, чтобы сделать что-нибудь полезное.

int main()
{
    nullptr();
    0();
    (1 == 2)();
    return 0;

}

Ответы [ 4 ]

3 голосов
/ 21 октября 2011

Использование константы 0 в качестве выражения функции является расширением, характерным для Microsoft.Они реализовали это специально, потому что они видели причину этого, которая объясняет, почему не имеет смысла рассматривать это как ошибку.Но так как он нестандартный, компилятор выдает предупреждение.

Вы правы, что это альтернатива использованию __noop ().

1 голос
/ 22 октября 2011

Как объяснено на странице предупреждения C4353 и во внутренней документации __noop , использование 0 в качестве выражения функции указывает компилятору Microsoft C ++ игнорировать вызовы кфункция, но все еще генерирует код, который оценивает ее аргументы (для побочных эффектов).

В данном примере приведен макрос трассировки, который получает #defined либо __noop, либо функции печати, в зависимости от значениясимвол препроцессора DEBUG:

#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

int main() {
   PRINT("\nhello\n");
}
1 голос
/ 22 октября 2011

Все это:

    nullptr();
    0();
    (1 == 2)();

- это операторы без операции (то есть они ничего не делают).

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

0 голосов
/ 22 октября 2011

Страница MSDN для этого предупреждения имеет достаточное объяснение и мотивирующий пример:

// C4353.cpp
// compile with: /W1
void MyPrintf(void){};
#define X 0
#if X
   #define DBPRINT MyPrint
#else
   #define DBPRINT 0   // C4353 expected
#endif
int main(){
    DBPRINT();
}

Как вы можете видеть, это поддерживает использование архаичного макроса.

...