【发布时间】:2010-10-01 11:52:42
【问题描述】:
在gcc编译器中,sizeof(main)、sizeof(printf)和sizeof(scanf)都是1。
我想知道所有这些的大小是1。这背后的逻辑是什么?
【问题讨论】:
在gcc编译器中,sizeof(main)、sizeof(printf)和sizeof(scanf)都是1。
我想知道所有这些的大小是1。这背后的逻辑是什么?
【问题讨论】:
因为 C(99) 标准要求 (§6.5.3.4/1)
sizeof运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位域的表达式成员。
所以返回值是没有意义的。如果需要sizeof 函数指针,请使用
sizeof(&main)
sizeof(&printf)
sizeof(&scanf)
gcc 在 sizeof 无意义的类型上返回 1(参见 c-common.c):
4187 if (type_code == FUNCTION_TYPE)
4188 {
4189 if (is_sizeof)
4190 {
4191 if (complain && (pedantic || warn_pointer_arith))
4192 pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4193 "invalid application of %<sizeof%> to a function type");
4194 else if (!complain)
4195 return error_mark_node;
4196 value = size_one_node;
4197 }
4198 else
4199 value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
4200 }
4201 else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
4202 {
4203 if (type_code == VOID_TYPE
4204 && complain && (pedantic || warn_pointer_arith))
4205 pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4206 "invalid application of %qs to a void type", op_name);
4207 else if (!complain)
4208 return error_mark_node;
4209 value = size_one_node;
4210 }
【讨论】:
-pedantic,gcc 会发出警告。显然在非标准模式下(没有-pedantic),gcc 可以做它喜欢做的事:如果你不遵循标准,那么 everything 在定义上都是未定义的行为。