繁体   English   中英

C++ 相当于 C99 复合文字

[英]C++ equivalent to C99 Compound Literals

我是现代 C++ 的新手。我正在编写一个序列化程序,需要写出一个字节(分隔符)。 在 C99 中,我会使用复合文字来保存值,如下所示:

enum {
   TAG_DELIMITER,
   // ...
   TAG_MAX
};

void write_buf(out_buf *dest, char *src, size_t n);

void encode(out_buf *buf, user_data *d) {
   // ... Write out user data
   write_buf(buf, &(char){TAG_DELIMITER}, sizeof(char));
}

在 C++ 中,设置类似:

class UserData {
public:
  // ... Some data

  void encode(std::ostream &buf) {
    // ... Write out user data
    char tmp = TAG_DELIMITER;
    buf.write(&tmp, sizeof(tmp));
  }
}

声明一个tmp变量感觉很笨拙。 这没什么大不了的,如果我真的很在意的话,我可以使用扩展来启用复合文字。 但是我缺少一种“C++-ish”的方法吗? 针对 GCC 10.1 上的 C++20

编辑:澄清一下,枚举中的值在整个代码库中使用,因此我不会将它变成 class 中的一堆 constexprs。无论如何,这只是将我的tmp变量移动到 static class 成员中,这真的好不到哪里去。

这个问题也许会更好地表述为“有没有办法在 C++ 中声明和获取匿名变量的地址?” 我认为答案是否定的。

无论如何,评论是正确的,我在这里真正想要的只是ostream.put(TAG_DELIMITER) ,它巧妙地避开了整个问题。

您可以使用constexpr

class UserData {
public:
    constexpr static char TAG_DELIMITER = 'a';
  // ... Some data

  void encode(std::ostream &buf) {
    // ... Write out user data
    const char * tmp = &TAG_DELIMITER;
    buf.write(tmp, sizeof(char));
  }
};

但是,当您尝试获取其地址时,您需要使用const char *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM