在C中每次使用冒号(":")

use*_*234 11 c

我很好奇每个上下文中冒号(":"字符)是C程序中有效的句法元素(在字符串/字符文字,注释等之外).

我尝试搜索C99规范,但":"匹配每一页,"冒号"没有找到每个用法.类似地,通过浏览玩具C 解析器(我理解lex/yacc 不能解析C)我似乎只能找到部分结果.

这些是我知道使用冒号的场景:

  • 条件运算符
  • 位字段
  • 标签

C中是否还有使用冒号的其他语言功能?

Ale*_*exD 10

C标准(N1570)定义了有向图:

6.4.6标点符号
....

3   在语言的各个方面,六个令牌

        <: :> <% %> %: %:%:

  行为分别与六个令牌相同79)

        [ ] { } # ##

除了他们的拼写.80)


79)这些代币有时被称为"有向图".

80)因此[,<:当''stringized''(见6.10.3.2)时表现不同,但可以自由地互换.

作为旁注,C++标准详细阐述了这个术语:

术语"有向图"(由两个字符组成的标记)并不是完全描述性的,因为其中一个备用预处理标记%:%:当然是几个主要标记包含两个字符.尽管如此,那些不是词汇关键词的替代标记通俗地称为"有向图".

根据Digraphs和trigraphs:

1994年,C99中包含的C标准的规范性修订提供了有向图,作为五种三字母的可读替代品.....

与三字符不同,在标记化过程中处理有向图,并且任何有向图必须始终表示完整标记,或者组成%:%:替换预处理程序连接标记的标记##.如果有向图序列出现在另一个标记内,例如带引号的字符串或字符常量,则不会替换它.

  • 哇。我完全不知道。 (2认同)

Mar*_*sha 7

由于标签是,而不是例如,我在 GNU C 扩展asm 扩展中的答案用法中遇到了尚未提及的问题:

使用扩展的 asm,您可以从汇编器读取和写入 C 变量,并执行从汇编代码到 C 标签的跳转。扩展 asm 语法使用冒号 ( :) 分隔汇编程序模板后的操作数参数:

 asm [volatile] ( AssemblerTemplate
                  : OutputOperands
                  [ : InputOperands
                  [ : Clobbers ] ])

 asm [volatile] goto ( AssemblerTemplate
                       :
                       : InputOperands
                       : Clobbers
                       : GotoLabels)
Run Code Online (Sandbox Code Playgroud)

asm关键字是GNU扩展。在编写可以使用-ansi各种-std选项进行编译的代码时,请使用__asm__代替asm


Kei*_*son 6

除了已经提到的情况,:字符可能合法出现在(参考C11标准的N1570草案,6.10p1中的语法):

  • H-炭序列一个的#include指令:
    #include <foo:bar.h>
    (6.10.2p2)

  • 所述Q-炭序列的一个#include#line指令:
    #include "foo:bar.h"
    这不是语法一个字符串(6.10.2p3)

  • 宏定义的替换列表
    #define COLON :

  • 一个非指令(尽管名称如此,它实际上是一个预处理器指令:
    # :
    是的,我相信这是有效的,尽管 gcc 和 clang 拒绝它。

  • 一个#error指令:
    #error foo : bar

  • 一个#pragma指令: #pragma foo : bar

这些都不可能出现在实际代码中(尽管我认为#includeWindows 特定代码的指令可能会引用"C:\dir\blah.h")。


Sch*_*ern 5

搜索C99附录A语法,我们有...

标点符号

已被@AlexD覆盖。

条件表达式(又名三元)

logical-OR-expression ? expression : conditional-expression
Run Code Online (Sandbox Code Playgroud)

struct-declarator(又名struct位域)

declarator[optional] : constant-expression
Run Code Online (Sandbox Code Playgroud)

带标签的语句(最常在switch语句中使用)

identifier : statement
case constant-expression : statement
default : statement
Run Code Online (Sandbox Code Playgroud)

就是这样。