C中每次使用冒号(":#34;)

时间:2016-06-04 22:15:34

标签: c

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

我尝试搜索C99规范,但":"匹配每一页和"冒号"没有发现每一种用法。同样地,通过查看玩具C parsers(我理解解析C的lex / yacc aren't capable)我似乎只能找到部分结果。

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

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

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

4 个答案:

答案 0 :(得分:8)

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

  

6.4.6标点符号
....

     

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

     

GameStateListener <: :> <% %> %:

     

分别表现为六个令牌 79)

     

%:%: [ ] { } #

     

除了他们的拼写。 80)

           

79)这些代币有时被称为“有向图”。

     

80)因此##[在''stringized''时表现不同(见6.10.3.2),但可以自由互换。

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

  

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

根据Digraphs and trigraphs

  

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

     

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

答案 1 :(得分:4)

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

标点符号

@AlexD已涵盖。

条件表达式(又名三元组)

logical-OR-expression ? expression : conditional-expression

struct-declarator(又名struct bit-fields)

declarator[optional] : constant-expression

labeled-statement(最常用于switch语句)

identifier : statement
case constant-expression : statement
default : statement

就是这样。

答案 2 :(得分:4)

因为标签是,而不是,我在GNU C扩展asm extended的答案用法中尚未提到:

  

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

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

 asm [volatile] goto ( AssemblerTemplate
                       :
                       : InputOperands
                       : Clobbers
                       : GotoLabels)
     

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

答案 3 :(得分:3)

除了已经提到的案例之外,:字符可能合法地出现在(引用属于C11标准的N1570草案,6.10p1中的语法):

  • #include指令的 h-char-sequence
    #include <foo:bar.h>
    (6.10.2p2)

  • #include#line指令的 q-char-sequence
    #include "foo:bar.h"
    这在语法上不是字符串文字(6.10.2p3)

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

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

  • #error指令:
    #error foo : bar

  • #pragma指令: #pragma foo : bar

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