0

私が知ってsizeofいるように、コンパイル時演算子ですが、なぜこのコードは警告なしに正しくコンパイルおよび実行されるのですか?

#include <iostream>

    int main() {    
        int size;
        std::cin >> size;
        int array[size];
        std::cout << sizeof(array) / sizeof(int) << std::endl;
    }



g++ -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-9)
4

1 に答える 1

5

まず、C ++には可変長配列(VLA)がないため、コードは有効なC++ではありません。それらはC機能です。C ++コンパイラは、これらを非標準の拡張機能としてサポートしています。-Wvlaまたはを使用-pedanticして警告を取得します。

warning: ISO C++ forbids variable length array 'array' [-Wvla]

次に、sizeof()C VLAに適用すると、演算子はコンパイル時の構成ではなくなります。C標準は§6.5.3.4でこれを示唆しています。sizeof演算子

オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。

于 2013-03-26T10:18:16.943 に答える