为什么GCC说变量未被使用?

Jef*_*son 4 c gcc

GCC说我在设置-Wall标志时没有使用snr_db,但是使用了这个变量.当我在for的范围之外初始化它时,gcc会停止警告我.有谁知道为什么会这样?

double snr_db;
double snr_db_step = #WHATHEVER

for (int interval = 1, snr_db = 20.0; interval <= intervals; interval++, snr_db -= snr_db_step) {
    snr_lin = pow(10.0, snr_db / 10.0);
    bit_err_rate = ber_bpsk(snr_lin);
    //CODE CONTINUES
}
Run Code Online (Sandbox Code Playgroud)

ame*_*yCU 12

实际上它没有被使用.你声明了double-

double snr_db; // this is unused 
Run Code Online (Sandbox Code Playgroud)

但在for循环中 -

for (int interval = 1, snr_db = 20.0; ..)
Run Code Online (Sandbox Code Playgroud)

在此snr_dbint在这里(这是因为同一情况下int x,y;,两者都是int为的一部分声明)并在阴影一个该环主体上方声明.

因此,double snr_db;仍未使用.

你可以这样做 -

double snr_db;
int interval; 

for(interval = 1, snr_db =20.0;..){....}  // only intialization
 /* ^^^^^^^^^^^^^^^^^^^^^^^^ this would be a different case from above as here
',' does work as comma operator therefore, evaluating both the expressions. */
Run Code Online (Sandbox Code Playgroud)

  • @GauravSehgal它是类型为`int`的声明列表的一部分 (2认同)

Bas*_*tch 5

你的for循环声明了两个 int 变量,包括一个(也是容易引起混淆的snr_db)变量,它double用嵌套的词法范围遮蔽外部.所以GCC是对的.

(根据经验,相信GCC编译器提供的警告经过极度测试和同行评审,所以信任编译器比你自己的代码更多)

您应该分配snr_db = 20.0; 之前for循环,你的情况是做的唯一理智的事情.

您可以使用逗号运算符,但这会使您的代码不可读:

for (int interval = (snr_db = 20.0), 1;  ///unreadable so confusing
Run Code Online (Sandbox Code Playgroud)

所以我不建议这样做.