【问题标题】:Define macro with colon at the end用冒号结尾定义宏
【发布时间】:2015-12-23 01:50:26
【问题描述】:

我想要类似的东西

#define TEXT: "something "
int main(){


}

99% 的例子“lala”是一个类的新实例

【问题讨论】:

  • 你想用这个做什么?照原样,TEXT(abc) 等同于写作: std::cout<<abc;。而且您还没有发布真正的错误。该注释只是错误的一部分,并扩展了它发生的位置。您没有在宏扩展有效的上下文中使用宏。
  • 我投票决定清除这个问题,因为目前还不清楚......实际用例和动机是什么......
  • 我已经定义了类似 TEXT(name): 最后带有冒号的东西,因为在 main() 中应该是 TEXT(R1): .. 最后带有冒号.. 也许这可以通过运算符重载解决?目前尚不清楚 TEXT(r1): 是否是一个类的新实例..

标签: c++ macros


【解决方案1】:

宏名称只能由字母数字字符和下划线组成,即“a-z”、“A-Z”、“0-9”和“_”,并且第一个字符不应是数字。一些预处理器也允许使用美元符号'$',但你不应该使用它;不幸的是,我无法引用 C 标准,因为我没有它的副本。

来自 GCC 文档:

预处理标记分​​为五类:标识符、预处理数字、字符串文字、标点符号等。标识符与 C 中的标识符相同:任何以字母或下划线开头的字母、数字或下划线序列。 C的关键字对预处理器没有意义;它们是普通的标识符。例如,您可以定义名称为关键字的宏。定义了唯一可以被视为预处理关键字的标识符。见定义。

对于使用 C 预处理器的其他语言来说,这主要是正确的。但是,即使在预处理器中,C++ 的一些关键字也很重要。请参阅 C++ 命名运算符。

在 1999 年的 C 标准中,标识符可能包含不属于“基本源字符集”的字母,由实施决定(例如带重音的拉丁字母、希腊字母或中国表意文字)。这可以通过扩展字符集或 '\u' 和 '\U' 转义序列来完成。这个特性在 GCC 中的实现是实验性的;此类字符仅在 '\u' 和 '\U' 形式中被接受,并且仅在使用 -fextended-identifiers 时才被接受。

作为扩展,GCC 将 '$' 视为一个字母。这是为了与某些系统兼容,例如 VMS,其中“$”通常用于系统定义的函数和对象名称。 '$' 不是严格符合模式的字母,或者如果您指定了 -$ 选项。请参阅调用。

【讨论】:

    【解决方案2】:

    预处理器标识符可以是任何以字母或下划线开头的字母、数字或下划线序列。换句话说,你不能有一个以(或通常包含)冒号结尾的。

    【讨论】:

      【解决方案3】:

      定义一个以冒号或分号结尾的宏通常是不好的。试试吧

      #define OUT(name) do {std::cout << name;} while(0)
      

      this explanation

      如果是一些日志记录宏,请考虑

      #define LOG(Out) do {std::cout << __FILE__ << ":" << __LINE__ << " " \
                           << Out << std::endl; } while(0)
      

      您可以将其用作:LOG("x=" &lt;&lt; x &lt;&lt; " and y=" &lt;&lt; y);

      顺便说一句,您可以要求您的编译器向您显示预处理的结果。如果使用GCC,你可以compile你的源代码mysource.ccg++ -C -E -H mysource.cc &gt; mysource.ii(也许在-H之前添加其他相关的预处理器选项,如-Isomedir)并查看编辑器或寻呼机进入生成的mysource.ii,其中包含预处理的表单。

      【讨论】:

      • 对我来说,OP 似乎希望宏 name 以冒号结尾。
      • 我想调用宏 TEXT(lala): 最后带有冒号 #define TEXT(name): "something OR a new instance of class" int main(){ TEXT(lala): }
      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多