Partage via


Avertissement du compilateur (niveau 1) C5105

l’extension de macro produisant « définie » a un comportement non défini

Notes

Le préprocesseur a détecté un defined opérateur dans la sortie d’une extension de macro. Si un defined opérateur apparaît comme le résultat d’une extension de macro, la norme C spécifie le comportement comme non défini. L’avertissement C5105 est un avertissement de portabilité et de conformité aux normes, émis car d’autres compilateurs conformes peuvent avoir un comportement différent. Pour résoudre ce problème, déplacez l’opérateur defined hors de la macro ou supprimez l’avertissement C5105.

Comportement spécifique à Microsoft : le compilateur MSVC évalue normalement l’opérateur defined , même sous /permissive-.

Cet avertissement est nouveau dans Visual Studio 2017 version 15.8. Elle est générée uniquement par le nouveau préprocesseur conforme aux normes, spécifié par l’option du /experimental:preprocessor compilateur.

Pour désactiver l’avertissement sans modification du code

Vous pouvez désactiver l’avertissement pour une ligne de code spécifique à l’aide du pragma d’avertissement. #pragma warning(suppress : 5105) Vous pouvez également désactiver l’avertissement dans un fichier à l’aide du pragma #pragma warning(disable : 5105)d’avertissement. Vous pouvez désactiver l’avertissement globalement dans les builds de ligne de commande à l’aide de l’option de ligne de commande /wd5105 .

Pour désactiver l’avertissement d’un projet entier dans l’IDE Visual Studio :

  1. Ouvrez la boîte de dialogue Pages de propriétés de votre projet. Pour plus d’informations sur l’utilisation de la boîte de dialogue Pages de propriétés, consultez Pages de propriétés.
  2. Sélectionnez la page Propriétés>de configuration C/C++>Avancé.
  3. Modifiez la propriété Disable Specific Warnings pour ajouter 5105. Choisissez OK pour appliquer vos modifications.

Exemple

Cet exemple de programme montre comment générer l’avertissement C5105 et comment le corriger.

// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.

#include <iostream>

#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif

int main()
{
#if DEFINED_TEST  // C5105
    std::cout << "TEST defined\n";
#else
    std::cout << "TEST not defined\n";
#endif
}