最后用冒号定义宏

时间:2015-12-23 01:50:26

标签: c++ macros

我想要像

这样的东西
#define TEXT: "something "
int main(){


}

99%示例“lala”是类

的新实例

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

来自GCC文件:

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

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

在1999 C标准中,标识符可能包含不属于“基本源字符集”的字母,由执行人员自行决定(例如重音拉丁字母,希腊字母或中文表意文字)。这可以通过扩展字符集或'\ u'和'\ U'转义序列来完成。 GCC中此功能的实现是实验性的;只有在使用-fextended-identifiers时才会在'\ u'和'\ U'表单中接受此类字符。

作为延期,海湾合作委员会将'$'视为一封信。这是为了与某些系统(如VMS)兼容,其中“$”通常用于系统定义的函数和对象名称。 '$'不是严格符合模式的字母,或者如果指定 - $选项。请参阅调用。

答案 2 :(得分:-1)

通过冒号或分号定义宏结尾通常很不好。尝试改为

#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=" << x << " and y=" << y);

顺便说一句,您可以要求编译器向您显示预处理的结果。如果使用GCC,您可以mysource.cc使用g++ -C -E -H mysource.cc > mysource.ii添加-I源代码(可能会添加其他相关的预处理器选项,例如-H somedir ,在mysource.ii之前,并使用编辑器或寻呼机查看包含预处理表单的生成的td