簡體   English   中英

GCC不會通過位屏蔽警告0或1

[英]GCC doesn't warn about 0 or 1 with bit-masking

以下程序在GCC上運行正常,沒有任何警告。

#include <stdio.h>

int func(unsigned int mask)
{
    return (!mask & 0) ? 1 : 0;  // No warning for 0 or 1
                    ^^
                    0 or 1
}

int main() {
        func(1);
        return 0;
}

在這個程序中,如果我寫01 GCC不發出任何警告。

但是,如果我寫其他數字如2

 return (!mask & 2) ? 1 : 0; // GCC gives warning

然后,GCC發出以下警告。

 warning: suggest parentheses around operand of ‘!’ or change ‘&’ to ‘&&’ or ‘!’ to ‘~’ [-Wparentheses]
     return (!mask & 2) ? 1 : 0;

GCC警告其他數字,例如2 ,這很好,但是為什么不警告01呢?

 (!mask & 2)

在這里,您將按位運算符與布爾運算符混合在一起。 這與01無關緊要,因為僅處理第一位(布爾運算符將表達式轉換為0或1),但對於2則無論是否加上括號,結果都不同,因此發出警告。

(這里的另一個例子證明了gcc努力不發出不必要的警告)

因為您的代碼是有效的C代碼。 警告只是一個建議

BTW !mask (邏輯非運算)是一個布爾值,因此只能為0或1。如果要按位非運算,請使用~mask 查看C 中的運算符列表

正如讓·弗朗索瓦·法布爾(Jean-FrançoisFabre)所解釋的,具有0和1是合法且常見的(它們是常見的位掩碼)。

GCC(使用gcc -Wall -Wextra )發出了一些警告(使用啟發式方法),但是它必須在奇怪但有效的代碼情況與不可能的代碼情況之間取得平衡。 它試圖避免發出無用的警告。

如果需要,您可以擴展GCC以發出其他警告。 只需花費幾個月的時間編寫您自己的提供這些警告的GCC插件即可

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM