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_db是int在这里(这是因为同一情况下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)
你的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)
所以我不建议这样做.
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |