【问题标题】:C90 compound literalsC90 复合文字
【发布时间】:2012-05-24 19:08:26
【问题描述】:

在 C99 中,如果 x 被提前声明并且是 v2 类型,那么我可以这样写:

x = (v2) { 1, 2 };

v2 在哪里:

typedef struct {
    int x;
    int y;
} v2;

我可以在 C90 中做类似的事情吗?

【问题讨论】:

    标签: c standards c99 ansi c89


    【解决方案1】:

    AFAIK,复合文字是在 C99 中准确引入的。但是,如果您使用的是 GCC,则此功能可作为扩展使用。引用GCC docs:

    ISO C99 支持复合文字。复合文字看起来像包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。 作为扩展,GCC 支持 C90 模式和 C++ 中的复合文字

    关于 GCC 的这个特性的另一个说明:

    作为 GNU 扩展,GCC 允许通过复合文字初始化具有静态存储持续时间的对象(这在 ISO C99 中是不可能的,因为初始化器不是常量)。如果复合文字和对象的类型匹配,则它的处理方式就像对象仅使用括号括起来的列表进行初始化一样。复合文字的初始化列表必须是常量。如果正在初始化的对象具有未知大小的数组类型,则大小由复合字面量大小决定。

    static struct foo x = (struct foo) {1, 'a', 'b'};
    static int y[] = (int []) {1, 2, 3};
    static int z[] = (int [3]) {1};
    

    以上几行等价于以下内容:

    static struct foo x = {1, 'a', 'b'};
    static int y[] = {1, 2, 3};
    static int z[] = {1, 0, 0};
    

    【讨论】:

      【解决方案2】:

      在没有编译器扩展的情况下,您可以在 C90 中获得最接近的结果是:

      {
          v2 temp = { 1, 2 };
          x = temp;
      }
      

      您可以将其压缩为一行或替换为宏。 (不过,由于 C 没有卫生的宏,当然,你必须小心声明变量的宏。)

      【讨论】:

        【解决方案3】:

        不,这是 C99 功能。但是,一些编译器会允许它作为 C89 模式下的扩展,例如gcc。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多