【问题标题】:Are code blocks inside parenthesis in C/C++ legal and can MSCL compile it?C/C++ 中括号内的代码块是否合法,MSCL 可以编译吗?
【发布时间】:2015-12-26 22:52:54
【问题描述】:

我有以下代码:

int x;
x = ({ 1; 2; 3; });
printf("%d\n", x); // should be 3

(如果你好奇我为什么会写出那样恶心的代码。答案是我不会。我正在编写一个输出 C 代码的生成器,拥有这样的语句会让事情变得容易得多。 )

代码在 Apple LLVM 版本 7.0.2 上编译和工作(当然会警告未使用的代码),但在 MSCL 10.0 和 14.0 上失败(错误 C2059:语法错误:'{')。

我的问题是:1)这种代码(-abuse)有名称吗? 2) 在任何 C/C++ 标准中是否合法? 3) 有没有办法让MSCL接受?

【问题讨论】:

  • 这可能是 GCC statement expression,这是一个非标准的供应商扩展。
  • 我明白了。这就说得通了。如果 mscl 中没有等效的功能,我想我将不得不重新设计我的生成器。
  • 即使有{}({}) 括号,x = 1; 2; 3; 的意义何在?
  • 如果您使用 C++11,您可以将其设为 lambda 并立即调用它。 x = [](){ 1; 2; return 3; }();。 (我可能语法错误;已经有一段时间了,但你明白了)
  • 所以这是一个 X-Y 问题?

标签: c++ c cl gcc-extensions


【解决方案1】:

对问题的 MSCL 部分一无所知,因为我一直使用 GCC。在 GCC 中:

1) 这叫compound statement expression

2) 这是一个非标准的 GCC 扩展。

【讨论】:

  • 谢谢,快速谷歌显示 cl 没有类似的功能。我想我可以改用 lambda 函数。不想去 C++ 但我想我必须去。
【解决方案2】:

为什么不使用逗号运算符而不是复合语句表达式,直接写:

x = ( 1, 2, 3 );

【讨论】:

  • 我以它为例,但我真正需要的是 ({ statement; statement; 0 }) 之类的东西,其中可能定义了作用域变量。
  • 为什么不写x = 3;
  • @Yifan:你是用预处理器生成代码还是用自己的代码生成器生成代码?
  • 具体来说,我正在修改CGEN,希望不需要修改太多。
  • 如果 statements 不是表达式,恐怕 MSCL 没有解决方案。但是如果要存储在x 中的值是常量并且语句中没有使用x,您当然可以生成:x = 0; statement; statement;
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多