C++中sizeof内的函数调用不会执行?无定义函数为何不报错?
问题解答
为什么没有函数定义也不会触发链接错误?
sizeof是C/C++中的编译期运算符,它仅计算操作数的类型对应的内存大小,完全不会执行操作数对应的实际代码。你写在sizeof内部的f(2)不会真的触发函数调用,编译器只会推导这个表达式的返回值类型为int,因此不需要获取函数f的实现,自然不会触发链接错误。
你运行得到的结果4,就是当前编译环境下int类型的占用字节数。
sizeof处理内部表达式的通用规则
- 绝大多数场景下
sizeof的计算完全在编译阶段完成,运行阶段不会产生任何相关运算逻辑 - 当
sizeof的操作数是表达式时,不会对表达式做实际求值,仅静态推导表达式最终返回值的类型,返回该类型的字节大小 - 唯一例外是C标准支持的可变长度数组(VLA)场景:当
sizeof作用于可变长度数组时,需要在运行期计算数组的实际大小,其余场景均符合上述两条规则
可以参考下面的代码验证「不对表达式求值」的特性:
#include <iostream> int main() { int a = 10; std::cout << sizeof(a++) << std::endl; // 输出int的大小,通常为4 std::cout << a << std::endl; // 输出10,a++没有被实际执行 return 0; }
内容的提问来源于stack exchange,提问作者Eduard Rostomyan
相关产品推荐
相关产品推荐

