我很好奇每个上下文中冒号(":"字符)是C中有效的句法元素(字符串/字符文字,注释等之外)程序
我尝试搜索C99规范,但":"匹配每一页和"冒号"没有发现每一种用法。同样地,通过查看玩具C parsers(我理解解析C的lex / yacc aren't capable)我似乎只能找到部分结果。
这些是我知道使用冒号的场景:
C中是否还有使用冒号的其他语言功能?
答案 0 :(得分:8)
C标准(N1570)定义了有向图:
6.4.6标点符号
....3 在语言的各个方面,六个令牌
GameStateListener
<:
:>
<%
%>
%:
分别表现为六个令牌 79)
%:%:
[
]
{
}
#
除了他们的拼写。 80)
79)这些代币有时被称为“有向图”。
80)因此
##
和[
在''stringized''时表现不同(见6.10.3.2),但可以自由互换。
作为旁注,C ++标准详细阐述了术语:
术语“有向图”(由两个字符组成的标记)不是 完全描述性,因为其中一个替代预处理标记是
<:
,当然有几个主要标记包含两个 字符。尽管如此,那些不是词汇关键词的替代标记通俗地称为“有向图”。
1994年,C99中包含的C标准的规范性修正案提供了有向图,作为五种三字母的可读替代品。 ....
与trigraphs不同,digraphs在标记化过程中处理,任何有向图必须始终表示完整的标记,或者组成标记
%:%:
替换预处理程序连接标记%:%:
。如果有向图序列出现在另一个标记内,例如带引号的字符串或字符常量,则不会被替换。
答案 1 :(得分:4)
搜索C99附录A语法,我们有......
@AlexD已涵盖。
logical-OR-expression ? expression : conditional-expression
declarator[optional] : constant-expression
identifier : statement
case constant-expression : statement
default : statement
就是这样。
答案 2 :(得分:4)
因为标签是c,而不是c99,我在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"
)。