/Zc:strictStrings
(禁用字符串文本类型转换)
指定后,编译器要求通过使用字符串文本初始化的指针符合严格的 const
限定。
语法
]$
注解
如果指定了 /Zc:strictStrings
,则编译器针对字符串文本(如类型“const char
的数组”或“const wchar_t
的数组”,具体取决于声明)强制执行标准 C++ const
限定。 字符串文本不可变,并且尝试修改一个字符串文本的内容将导致在运行时出现访问冲突错误。 必须将字符串指针声明为 const
以通过使用字符串文本将其初始化,或使用显式 const_cast
以初始化非 const
指针。 或者默认情况下,如果指定了 /Zc:strictStrings-
,则编译器不会针对通过使用字符串文本初始化的字符串指针强制执行标准 C++ const
限定。
/Zc:strictStrings
选项默认处于关闭状态。 /permissive-
编译器选项隐式设置此选项,但可以使用 /Zc:strictStrings-
重写它。
使用 /Zc:strictStrings
选项来阻止编译错误代码。 此示例显示一个简单声明错误如何在运行时导致崩溃:
// 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
}
当 /Zc:strictStrings
处于启用状态时,相同的代码将报告 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';
}
如果使用 auto
声明字符串指针,则编译器将为你创建正确的 const
指针类型声明。 尝试修改 const
指针的内容将由编译器报告为错误。
注意
Visual Studio 2013 中的 C++ 标准库不支持调试生成中的 /Zc:strictStrings
编译器选项。 如果在你的生成输出中看到多个 C2665 错误,则可能由此原因造成。
有关 Visual C++ 中一致性问题的详细信息,请参阅 Nonstandard Behavior。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
修改“附加选项”属性以包含
/Zc:strictStrings
,然后选择“确定”。