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++,因为 C++ 中没有可变长度数组(VLA)。它们是 C 功能。您的 C++ 编译器支持它们作为非标准扩展。使用-Wvla-pedantic获得警告:

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

其次,sizeof()运算符在应用于 C VLA 时不再是编译时构造。C 标准在§6.5.3.4 The sizeofoperator中暗示了这一点:

如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

于 2013-03-26T10:18:16.943 回答