2017-10-16 60 views
-2

我的C和編譯器的知識,在這一點上非常過時,前幾天我遇到的代碼來是這樣的:缺少賦值的行的GCC/C++編譯器警告?

foo + bar + quz; 

該行應爲:

foo += bar + quz; 

我們正在與編譯-Wall我希望編譯器至少會發出警告。

我錯過了什麼,或者是第一個例子在C/C++中完全合理和經常看到的行嗎?

這裏是gcc -v的信息:

我創建了一個簡單的例子來證明我的問題

# gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 6.3.0 20170516 (Debian 6.3.0-18) 

編輯:https://godbolt.org/g/WWKNCv

下面是代碼:

#include <iostream> 
#include <string> 

static const char FOO[] = "hello"; 

int main(int argc, const char* argv[]) 
{ 
    std::string a = FOO; 
    std::string c = "world"; 
    a + ", " + c; 
    std::cout << a << "\n"; 
} 

我可以使用g++ -Wall test.cpp成功編譯此代碼,並且a + ", " + c行沒有編譯器警告。有人能解釋爲什麼嗎?

我知道string有一個運營商+(在閱讀http://www.cplusplus.com/reference/string/string/operator+/後)。這是一個例子,編譯器無法知道該行是無用的嗎?

+7

當我使用'-Wall'時,我得到一個警告「聲明沒有影響[-Wunused-value]」。 –

+0

我敢肯定,*內建類型* gcc會發出「聲明無效」警告,至少在某些警告級別 - 嘗試使用'-Wextra'。然而,如果任何操作數是帶有重載操作符的類類型(可能不是完全微不足道的,或者如果平凡,其定義不是內聯的),編譯器沒有理由懷疑該語句是無用的 - 沒有人說重載操作符具有內建的語義相同。 –

+2

[不可重現](https://godbolt.org/g/SDb3eK) –

回答

3

(從評論移動)

我敢肯定的是,對於內建類型,GCC會發出「聲明沒有影響」的警告,至少在一些警告級別 - 嘗試用-Wextra - 編輯實際上,我現在看到它應該包含在內,即使在-Wall

但是,如果任何操作數是類型重載的operator+(可能不是完全微不足道的,或者如果不重要,其定義不是內聯的),編譯器沒有理由懷疑語句是無用的 - 沒有人說重載運算符具有相同的內建語義。想想所有那些cout<<"hello world!";,如果編譯器假定與內建類型相同的語義,它們都將生成「語句無效」警告。