【问题标题】:What curly braces inside a function call mean in C?函数调用中的花括号在 C 中是什么意思?
【发布时间】:2023-08-19 19:24:01
【问题描述】:

我尝试解决 K&R C 书中的练习 1-24,您必须在其中创建一个可以检测基本语法错误(不平衡括号、方括号等)的程序。我运行了一些测试以在分散在我系统上的 C 源文件上对其进行调试。 我的程序在文件中遇到此行时检测到错误:

av_opt_set_q  (abuffer_ctx, "time_base", (AVRational ){ 1, INPUT_SAMPLERATE }, AV_OPT_SEARCH_CHILDREN);

我做了一个假设,每次遇到常规大括号(在 cmets、双引号之外)时,必须平衡括号和括号。正如此错误所示,这不是真的。不幸的是,我找不到它的含义。谢谢你的帮助。

【问题讨论】:

  • K&R 太老了,无法正确教授标准 C。复合文字是在 1999 年引入的。考虑买一本不超过 20 年的书。

标签: c curly-braces compound-literals


【解决方案1】:

这个

 (AVRational ){ 1, INPUT_SAMPLERATE }

compound literal。查看更多相关信息here

来自C11,第 §6.5.2.5 章

一个后缀表达式,由一个带括号的类型名称后跟一个大括号括起来的 初始化列表是一个复合文字。它提供了一个未命名的对象,其值由初始化列表给出。

也就是说,我看不出这里的大括号是如何不平衡的。这是一种有效的语法,您的工具在做出决定时应考虑到这一点。

【讨论】:

  • 谢谢@bath,又加了一份。
  • 大括号在这里是平衡的。我的意思是当遇到 "{" 或 "}" 时 "(", ")" 和 "[" ,]" 必须平衡。这只是一个猜测。
  • 一些较旧的语法突出显示工具(如vim)会因圆括号({}) 中的花括号而感到困惑。它将所有此类左大括号标记为错误。我不知道vim 的当前版本是否解决了这个问题,但是我正在使用的那个仍然有这个问题。对我来说,这只是一个麻烦;对于不熟悉 C 语法的人来说,这一定是吓坏了他们。
最近更新 更多