13

我最近遇到了一些看起来像这样的代码:

if(sizeof(var,2) == 4) { ... }

var类型在哪里)

我很惊讶地看到操作员似乎有两个参数sizeof。快速浏览 ISO/ANSI C99 标准并没有发现任何秘密。我无法想出任何允许逗号的语法阅读。

搜索 Google 代码,我能够在一些 PPC 代码中找到这种语法的示例

这是一些 PPC 特定的语法吗?这是什么意思?

编辑:事实证明,我正在查看的内容以及链接代码都是WindRiver Diab 编译器特有的语法:

sizeof(类型,int-const):

如果 int-const 为 0 ,则sizeof返回类型的字节大小。

如果 int-const 为 1 sizeof返回类型的对齐方式。

如果 int-const 为 2,则sizeof返回一个整数常量,指定类型的类型。在Diab C/C++ 用户指南中查找“sizeof 运算符”以 获取值。

哇,他们真的超载了sizeof运算符的含义。

EDIT2:完整的文档在这里:http ://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

4

5 回答 5

9

在进一步的研究中,我发现这是WindRiver Diab 编译器特有的行为。有关详细信息,请参阅问题中的编辑

于 2009-06-08T17:59:00.007 回答
3

在我看来,它就像逗号运算符的简单应用,它计算第一个参数,丢弃结果,然后计算第二个参数。

在这种情况下,它确定文字2的大小是否为 4。“ var”部分无关紧要。

于 2009-06-08T17:41:33.950 回答
1

看起来像一条红鲱鱼。我的猜测是您不小心使用了逗号运算符,并且 sizeof 被应用于最后一个值。

于 2009-06-08T17:43:21.263 回答
0

如前所述,正在应用逗号运算符,并且 sizeof 正在返回整数文字的大小。这看起来像是作者的错误,但可能会发生一些险恶的编码。

sizeof 表达式不被评估,因此它们可以用于许多棘手的事情。一个示例是为其他未引用的变量提供引用,而不会导致编译器生成任何代码。有关示例,请参阅有关创建更好的断言宏的这篇文章。Alexandrescu 在现代 C++ 设计中还有其他一些 sizeof 诡计的例子,如果有记忆的话。有可能,但不太可能,这些非显而易见的用法之一是有意的。

无论使用什么,如果在这种情况下没有评论,那么它显然不值得在可读性上进行权衡,应该改变。

于 2009-06-08T17:52:00.517 回答
0

重要免责声明:以下代码是伪代码。sizeof的参数实际上从未被评估,具有“执行”的含义,它始终是编译时构造(因此是模板作者首选的工具之一,如枚举)。

请注意,我auto在下面借用了 C++ (0x);它告诉编译器从初始化表达式中推断出类型并使示例更简单

许多人不知道的是,您可以sizeof像这样有效地调用:

auto s = sizeof int;

即,不需要括号。因此,如果将 (x,y) 传递给sizeof,则相当于

auto c = (x,y);
auto s = sizeof c;

要不就

auto c = x,y;
auto s = sizeof c;

x,y是一个序列,其中每个部分从左到右进行评估,并且序列获取最后一部分的值,在这种情况下是y. 所以,原始代码大致相当于

auto s = sizeof y;

所以在我看来,有问题的编译器确实做了一些非常非常脑残的事情,因为它引入了一个扩展,该扩展也可以在其他编译器上编译,但含义完全不同。这是不好的。

于 2011-06-17T11:45:18.453 回答