通过头文件在GCC中禁用警告消息?

Bis*_*Das 6 c gcc warnings gets header

gets()在我的C代码中使用该函数.我的代码工作正常,但我收到一条警告信息

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
Run Code Online (Sandbox Code Playgroud)

我希望不会弹出此警告消息.有什么办法吗?

我想知道通过创建一个用于禁用某些警告的头文件可能存在这种可能性.或者在编译期间有任何选项可以满足我的目的吗?或者可能有一种特殊的方法gets()用于此警告不要弹出?

小智 27

显而易见的答案是从编译器试图告诉你的内容中学习 - 你永远不应该使用gets(),因为它完全不安全.使用fgets()代替,这可以防止可能的缓冲区溢出.

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe
Run Code Online (Sandbox Code Playgroud)

  • 在现实生活中,您可能希望使用`sizeof buff`而不是复制缓冲区大小. (3认同)
  • 在现实生活中,您将希望通过诸如BUFFSIZE之类的常量来调整缓冲区的大小,并在fgets()调用中使用它. (3认同)
  • 这实际上并没有回答这个问题. (2认同)

Sam*_*iao 24

如果你真的想要使用它.

以下是答案来自:http://www.gamedev.net/community/forums/topic.asp?topic_id = 523641

如果您使用相当新版本的gcc,您可以使用:

#pragma GCC diagnostic ignored "your option here"
Run Code Online (Sandbox Code Playgroud)

例如,如果这些标头产生"浮点比较是不安全的"错误,您将使用:

#pragma GCC diagnostic ignored "-Wfloat-equal".
Run Code Online (Sandbox Code Playgroud)

不幸的是,你不能以这种方式禁用"-Wall"(这太简单了,不会......),你必须做个人警告选项 - 手动启用(至少是冲突的).

文档:http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

编辑: 但它似乎不起作用警告...我试过我的电脑.

  • 这仅适用于*编译器*发出的诊断."获取是不安全的"消息来自*链接器*和AFAIK,没有办法禁用它. (4认同)
  • +1虽然我同意不得使用gets(),但你是唯一一个真正回答OP问题的人:) (3认同)

Dir*_*tel 9

我会留意警告并更换gets.这对我来说足够清楚了:

BUGS

永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().


Dev*_*ler 8

使用fgets()而不是gets()

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);
Run Code Online (Sandbox Code Playgroud)

gets()函数不检查缓冲区的长度,可以写入结束并更改堆栈.这是你听到的"缓冲区溢出".


Bas*_*ard 6

没有充分的理由可以使用gets().即使是C标准也说它已经过时了!请fgets()改用.

[编辑]

看起来警告来自链接器.编译时会收到警告-c吗?(这会禁用链接.)


Mik*_*aid 5

您根本不应该使用该gets功能,该联机帮助表示要使用该功能fgets.

GCC不提供GCC使用编译指示禁用警告的功能.您必须使用各种警告选项作为编译器的标志.