/Zc:strictStrings
(Désactiver la conversion de type littéral de chaîne)
Quand il est spécifié, le compilateur requiert une conformité de qualification const
stricte pour les pointeurs initialisés à l'aide de littéraux de chaîne.
Syntaxe
/Zc:strictStrings
[-
]
Notes
Si /Zc:strictStrings
elle est spécifiée, le compilateur applique les qualifications C++ const
standard pour les littéraux de chaîne, en tant que type « tableau de const char
» ou « tableau de », en fonction de const wchar_t
la déclaration. Les littéraux de chaîne sont immuables et une tentative de modification du contenu d'un de ces littéraux entraîne une erreur de violation d'accès au moment de l'exécution. Vous devez déclarer un pointeur de chaîne en tant que const
pour l'initialiser en utilisant un littéral de chaîne ou utilisez un const_cast
explicite pour initialiser un pointeur non const
. Par défaut, ou s’il /Zc:strictStrings-
est spécifié, le compilateur n’applique pas les qualifications C++ const
standard pour les pointeurs de chaîne initialisés à l’aide de littéraux de chaîne.
L’option /Zc:strictStrings
est désactivée par défaut. L’option /permissive-
du compilateur définit implicitement cette option, mais elle peut être substituée à l’aide /Zc:strictStrings-
de .
Utilisez l’option pour empêcher la /Zc:strictStrings
compilation de code incorrect. Cet exemple montre comment une simple erreur de déclaration conduit à un incident au moment de l'exécution :
// strictStrings_off.cpp
// compile by using: cl /W4 strictStrings_off.cpp
int main() {
wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation
}
Lorsqu’il /Zc:strictStrings
est activé, le même code signale une erreur dans la déclaration de str
.
// strictStrings_on.cpp
// compile by using: cl /Zc:strictStrings /W4 strictStrings_on.cpp
int main() {
wchar_t* str = L"hello"; // error: Conversion from string literal
// loses const qualifier
str[2] = L'a';
}
Si vous utilisez auto
pour déclarer un pointeur de chaîne, le compilateur crée automatiquement la déclaration de type de pointeur const
correcte. Une tentative de modification du contenu d'un pointeur const
est signalée par le compilateur en tant qu'erreur.
Remarque
La bibliothèque C++ Standard dans Visual Studio 2013 ne prend pas en charge l’option du compilateur dans les /Zc:strictStrings
builds de débogage. Si vous voyez plusieurs erreurs C2665 dans votre sortie de build, cela peut être la cause.
Pour plus d’informations sur les problèmes de conformité dans Visual C++, consultez Nonstandard Behavior.
Pour définir cette option du compilateur dans l'environnement de développement Visual Studio
Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.
Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.
Modifiez la propriété Options supplémentaires à inclure
/Zc:strictStrings
, puis choisissez OK.