C中&lt ;:语法的意义是什么?

时间:2011-12-01 08:00:54

标签: c++ c gcc

  

可能重复:
  <: cannot begin a template argument list

你知道吗

int a<:10:>;

相当于

int a[10];

我正在编写一些代码,其中我有一个全局命名空间和一个受限制的命名空间,现在就说NS1。我在我的全局命名空间中有一个名为Module的类,我在NS1中导入了一些其他库,它们也有一个名为Module的类。我试图创建一个我的模块的std :: list,即在NS1中的一个函数内部的:: Module,这样做,我得到了这个编译错误

std::list<::Module*> &myModule;

genllvm.cpp:60:11: error: ‘<::’ cannot begin a template-argument list
./genllvm.cpp:60:11: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’
./genllvm.cpp:60:11: note: (if you use ‘-fpermissive’ G++ 

这个“&lt;:”语法有什么意义?

4 个答案:

答案 0 :(得分:11)

它的召唤替代令牌。 C ++有几个:

 <%     {
 %>     }
 <:     [
 :>     ]
 %:     #
 %:%:   ##
 and    &&
 bitor  |
 or     ||
 xor    ˆ
 compl  ~
 bitand &
 and_eq &=
 or_eq  |=
 xor_eq ˆ=
 not    !
 not_eq !=

您可以看到一些替代令牌由字母组成。所以你可以在编译器中编写if (a<b and b<c)来正确处理它们。它们的存在是因为键盘或字符集中缺少符号。替代标记永远不会被主要标记替换(与三字母不同),但它们的行为与主标记相同。

但是,C ++ 0x需要对<::(2.5p3)进行特殊处理:

  

否则,如果接下来的三个字符是&lt; ::和后续字符   字符既不是:也不是>,&lt;被视为预处理程序令牌   它本身而不是替代标记的第一个字符&lt;:。

这样就可以正确处理SomeTemplate<::SomeClass>

答案 1 :(得分:8)

这是针对没有[的字符集。

  

§6.4.6-3(C99)

     

在语言的所有方面,六个令牌

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

分别表现为与六个令牌相同

[  ]  {  }  #  ##

答案 2 :(得分:2)

处理终端和代码页限制是一件非常具有历史意义的事情。

阅读简短Wikipedia article on digraphs and trigraphs

答案 3 :(得分:1)

它被称为digraph。当终端没有C使用的某些字符时,它被用于。