相关疑难解决方法(0)

sizeof在可变长度数组上的行为(仅限C)

我的问题是sizeof()当传递参数是一个动态数组变量长度数组时,究竟如何表现.

我们来看一个例子:

int fun(int num_of_chars)
{
    char name_arr[num_of_chars] = {0};

    /* Do something*/

    return sizeof(name_arr);
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,很明显返回值不是编译时常量.因为大小取决于运行时的值num_of_chars.

引用C99标准(6.5.3.4):

sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.大小由操作数的类型确定.结果是整数.如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.

我从[....操作数被评估....]中可以理解的是,当传递的参数sizeof()动态数组变量长度数组时,sizeof()'表现得像'一个函数而不是一个运算符.

我的理解是对的吗?

c sizeof

15
推荐指数
2
解决办法
3572
查看次数

为什么将整数文字强制转换为指针值会导致非const表达式?

我正在尝试编写一个结构来计算基类和派生类之间的指针偏移量,作为C++ 03中的常量表达式.代码如下:

template <typename Base, typename Derived, typename Via = Derived>
struct OffsetToBase
{
    static const std::ptrdiff_t val =
        (const char*const)static_cast<Base*const>(static_cast<Via*const>((Derived*const)(1u << 7))) -
        (const char*const)(1u << 7);
};
Run Code Online (Sandbox Code Playgroud)

代码在GCC中编译,但不在clang和VC中编译.clang和VC产生的错误基本上表明初始化器不是一个常量表达式,clang进一步强调了子表达式(Derived*const)(1u << 7).

所以,我的问题是标准对此有何看法?如果初始化程序根据标准不符合常量表达式,那么这背后的原因是什么?

更新: 为了您的兴趣,我发现了以下两个讨论:

"初始化器元素不是常量"错误在Linux GCC中没有任何理由,编译C

关于转换为整数常量表达式(在标准C中)

但我不认为相同的规则适用于C++.

c++ expression casting const

7
推荐指数
1
解决办法
360
查看次数

标签 统计

c ×1

c++ ×1

casting ×1

const ×1

expression ×1

sizeof ×1