【问题标题】:What is the significance of the <: syntax in C? [duplicate]<: 语法在 C 中的意义是什么? [复制]
【发布时间】:2012-01-10 09:47:05
【问题描述】:

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

你知道吗

int a<:10:>;

等价于

int a[10];

?

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

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++ 

这个“<:>

【问题讨论】:

标签: c++ c gcc


【解决方案1】:

它的调用替代标记。 C++ 有几个:

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

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

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

否则,如果接下来的三个字符是 <:: :>, 的第一个字符

这样SomeTemplate&lt;::SomeClass&gt;才能被正确处理。

【讨论】:

    【解决方案2】:

    它适用于没有 [ 的字符集。

    §6.4.6-3 (C99)

    在语言的所有方面,六个标记

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

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

    [  ]  {  }  #  ##
    

    【讨论】:

    • 对于缺少它们的字符集来说可能更多。回到 7 位字符集的时代。 {}[]\ 和其他一些通常被替换为特定于语言环境的变音符号。为了在使用瑞典计算机时不必编写 aä2å,您可以使用 C 中的交替形式 a<:2:>(Pascal 中的 a(.2.)),它至少更具可读性。
    • @Fredrik 绝对很棒的信息。
    • 谢谢。然而,我有点错了。 a[2] 应该是 aÄ2Å,而不是 aä2å。但这只是无聊的细节:-)
    【解决方案3】:

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

    阅读短文Wikipedia article on digraphs and trigraphs。

    【讨论】:

      【解决方案4】:

      它叫做digraph。用于当终端没有 C 使用的某些字符时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2014-11-07
        • 2016-07-21
        • 2014-02-25
        • 2013-06-17
        相关资源
        最近更新 更多