编译警告不存在(GCC和g ++)

iDe*_*_gh 2 c c++ gcc g++

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 int main(int argc, char* argv[])
  5 {
  6     int bret = 1;
  7     bret - 2;
  8
  9     printf("bret=%d",bret);
 10     return 0;
 11 }
Run Code Online (Sandbox Code Playgroud)

在第7行中,没有左手操作符来显示值,仍然编译器没有生成任何警告,GCC和g ++都.这背后是否有任何意图的紫癜?

[ADDED/EDIT]根据评论,我只有在使用以下标志后才会收到警告:-Wall -Wextra

[debd@test]$gcc -Wall -Wextra test2.c
test2.c: In function 'main':
test2.c:7: warning: statement with no effect
test2.c:4: warning: unused parameter 'argc'
test2.c:4: warning: unused parameter 'argv'
[debd@test]$
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 5

就语言而言,没有错误 - 声明不需要产生副作用.

但是,由于一个不做任何事情的声明几乎肯定是一个错误,大多数编译器都会对此发出警告.您的,但仅当您通过命令行参数启用该警告时.

您可以启用该警告-Wunused-value,但我建议您启用一组体面的警告(包括此警告)-Wall -Wextra.

如您所见,这也会发出警告,表示函数参数未使用.既然如此main,您可以通过将签名更改为不具有任何参数来轻松修复它:

int main()
Run Code Online (Sandbox Code Playgroud)

更一般地说,如果你需要忽略参数来避免警告,C++允许你不要命名它们:

int main(int, char**)
Run Code Online (Sandbox Code Playgroud)

并且两种语言都允许您显式使用但忽略该值

(void)argc;
(void)argv;
Run Code Online (Sandbox Code Playgroud)