【问题标题】:Compile time operators in CC中的编译时运算符
【发布时间】:2012-02-16 02:06:46
【问题描述】:

我只熟悉 C 语言中的一个编译时运算符 - sizeof。作为一名程序员,我还有其他需要注意的地方吗?

【问题讨论】:

  • C++ 不是 C 的严格超集
  • 那么它只是 sizeof,正如 Nic 在他的回答中指出的那样。请记住,当您向其提供常量时,任何运算符都可以是编译时的(例如,4*82<<5 将在运行时替换为 32)。
  • 我可以想到&a[constant1]-&a[constant2]中的-,其中a是一个数组(或指针)。
  • @Alex:这是一个涉及- 的特定表达式,由于操作数的一些有用属性,可以在编译时进行评估。这与 - 本身是一个“编译时运算符”不同

标签: c compile-time


【解决方案1】:

虽然不是严格意义上的运算符,但有offsetof,一个在stddef.h 中定义的宏。它用于获取struct 中字段成员的偏移量。例如:

#include <stddef.h>
struct my_struct
{
  int alpha;
  int beta;
};

int get_offset_to_beta(void)
{
  return offsetof(struct my_struct, beta);
}

【讨论】:

    【解决方案2】:

    新的 C 标准还有_Alignof,其工作方式类似于sizeof

    【讨论】:

      【解决方案3】:

      我认为您正在掌握但缺少描述的术语是常量表达式整数常量表达式。某些运算符的结果可以是(整数)常量表达式,如果它们的操作数是,并且正如您所指出的,sizeof 的结果可以是即使它的操作数不是常量,只要它不是 VLA。参见 C99 中的 6.6:

      http://port70.net/~nsz/c/c99/n1256.html#6.6

      【讨论】:

        【解决方案4】:

        据我所知,只有 sizeof,尽管在 C99 中 sizeof 不能在编译时为可变长度数组 (VLA) 完成。

        【讨论】:

        • 打败我,我只是注意到这是 C-only 并删除了它。 :)
        猜你喜欢
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2021-12-09
        相关资源
        最近更新 更多