C++ 为什么即使在我定义了“CRT\u SECURE\u NO\u警告”之后,编译器仍然警告我不安全的strtok?

C++ 为什么即使在我定义了“CRT\u SECURE\u NO\u警告”之后,编译器仍然警告我不安全的strtok?,c++,strtok,C++,Strtok,我正在使用Visual Studio Express 2012 for Windows桌面 我总是犯错误 Error C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 当我尝试构建以下内容时

我正在使用Visual Studio Express 2012 for Windows桌面

我总是犯错误

Error C4996: 'strtok': This function or variable may be unsafe.
  Consider using strtok_s instead.
  To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
  See online help for details.
当我尝试构建以下内容时:

#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char the_string[81], *p;
    cout << "Input a string to parse: ";
    cin.getline(the_string, 81);
    p = strtok(the_string, ",");
    while (p != NULL) {
        cout << p << endl;
        p = strtok(NULL, ",");
    }
    system("PAUSE");
    return 0;
}
#包括“stdafx.h”
#定义\u CRT\u安全\u无\u警告
#包括
#包括
使用名称空间std;
int main(){
char_字符串[81],*p;

CUT

看起来你打开了一个编译器选项,它迫使编译器把所有警告看作是错误。要么关闭这个选项,要么使用宏宏CRTySeCurrayNoWurnices < /P> < P>你的定义不起作用,因为你的预编译头文件(STDAFX.H)的内容。样板看起来像这样:

#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#pragma一次
#包括“targetver.h”
#包括
#包括
导致问题的是最后两个include,那些.h文件本身已经包含string.h。因此,您的定义太晚了

除了在编译器设置中定义宏之外,简单的解决方法是将#define移到stdafx.h文件中。修复:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#pragma一次
#定义\u CRT\u安全\u无\u警告
#包括“targetver.h”
#包括
#包括

这可能是一篇老文章,但我最近遇到了类似的问题。 我进入了项目选项->C/C++->预处理器->在预处理器定义列表中添加了CRT\U SECURE\U NO\U警告。 这样你就不必把它放在每个文件中。

试试下面的方法

#pragma warning (disable : 4996)

请注意错误号是C4996。

毫无疑问,也毫无意义。为什么不简单地使用
strtok_s
?有什么问题吗?您的
#定义
在任何情况下都应该在
之前#包括“stdafx.h”或替代地将其放入C++ +预处理器定义下的项目属性中。解决方案是在在线帮助中读取细节;2)使用“代码> Strutokss<代码>,如建议的那样,或者使用C++函数代替C。不要关闭警告。@ BrimtEnter,因为<代码> Sttokss是专有库扩展。n,因此不便于携带。