上学期的数据结构没学好想要复习数据结构的时候,去W3Cschool去看了一下数据结构 , 顺带把C语言也复习一遍 , 正好前两天VS发布了2022 , 于是便进行了更新 ,在结构体那一章节的时候 ,代码运行出现了错误
下面是原本代码
#include
#include
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Book */
struct Books Book2; /* 声明 Book2,类型为 Book */
/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* 通过传 Book1 的地址来输出 Book1 信息 */
printBook( &Book1 );
/* 通过传 Book2 的地址来输出 Book2 信息 */
printBook( &Book2 );
return 0;
}
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
在编译后出现了报错 : 于是就去谷歌查询了一下 , 微软官方的说明是编译器警告
错误是来源于微软的警告 , 主要是因为在旧的c语言库中 , 很多函数内部是没有进行参数的检测 , 微软出于好意 , 编写了新的安全的函数 , 将函数内部增加了安全检测 ,
新的函数会更加的安全和便捷。
微软官方文档
在查询了微软的官方文档后 ,微软提供了几种解决方案
其中微软说明的关闭警告的首选方式是将代码中的函数转换为微软推荐的函数 ,如将strcpy
更改为strcpy_s
,经过实际验证后 ,在上方代码中并未发现异常。
这种方法是通过使用警告杂注 #pragma warning(suppress : 4996)
来忽略编译器弹出的警告窗口。想在全局中关闭警告 , 则需要使用 /wd4996
命令行进行实现。
以及使用VS预处理器宏禁用警告 :
也可以在头文件中添加下面的代码进行屏蔽警告:
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996
将原来的旧函数替换成新的 Security CRT functions。
同方法一更改函数 ,但是一个个的更改过于麻烦 , 所以推荐一个更加简单的方法 :
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
这样在链接的时候会将其自动转换为CRT函数