如果我将宏定义为#define LOGIC_ONE 1并且想要LOGIC_ONE在case语句中使用,那么会LOGIC_ONE考虑哪种类型?
它被认为是int因为我为价值1定义它吗?
Ane*_*dar 19
C++宏是简单的文本替换.
在编译器启动时,您LOGIC_ONE已被1预编译器替换.它就像你1马上写的一样.(在这种情况下,这是一个int literal ...)
编辑以在评论中包含讨论:
如果您(或有权访问您的代码的其他人)更改您的内容#define LOGIC_ONE 1,#define LOGIC_ONE "1"它将改变其在您的程序中的行为并成为const char[]文字.
编辑:
由于这篇文章比我预期的更受关注,我想我为那些好奇的人添加了对C++ 14标准的引用:
2.2转换阶段 [lex.phases]
(...)
4.执行预处理指令,扩展宏调用,并执行_Pragma一元运算符表达式.(...)然后删除所有预处理指令.
(...)
7.分隔标记的空白字符不再重要.每个预处理令牌都转换为令牌.(2.6).由此产生的标记在语法和语义上进行分析并翻译为翻译单元.
如上所述,宏在阶段4中被替换,之后不再存在."语法和语义"分析发生在阶段7,其中代码被编译("翻译").
整数文字在中指定
2.13.2整数文字 [lex.icon]
(...)
整数文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略.整数文字可以具有指定其基数的前缀和指定其类型的后缀.
(......)表5 - 整数文字的类型
Run Code Online (Sandbox Code Playgroud)Suffix | Decimal literal | Binary, octal, or hexadecimal literal ----------------------------------------------------------------------------- none | int | int | long int | unsigned int | long long int | long int | | unsigned long int | | long long int | | unsigned long long int ----------------------------------------------------------------------------- u or U | unsigned int | unsigned int | unsigned long int | unsigned long int | unsigned long long int | unsigned long long int ----------------------------------------------------------------------------- l or L | long int | long int | long long int | unsigned long int | | long long int | | unsigned long long int ----------------------------------------------------------------------------- Both u or U | unsigned long int | unsigned long int and l or L | unsigned long long int | unsigned long long int ----------------------------------------------------------------------------- ll or LL | long long int | long long int | unsigned long long int ----------------------------------------------------------------------------- Both u or U |unsigned long long int | unsigned long long int and ll or LL | |
字符串文字在.中指定
2.13.5字符串文字 [lex.string]
(...)
1字符串文字是由双引号括起来的字符序列(如2.13.3中所定义),可选择以R,u8,u8R,u,uR为前缀,U,UR,L,rLR,如"......",R"(...)",u8"......",u8R"**(...)**",u".. .,"uR"*〜(...)*〜",U"......",UR"zzz(...)zzz",L"......"或LR"(...)" , 分别.
(...)
6在转换阶段6之后,不以encoding-prefix开头的字符串文字是普通的字符串文字,并用给定的字符初始化.
7以u8开头的字符串文字,例如u8"asdf",是一个UTF-8字符串文字.
8普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n的数组const char",其中n是下面定义的字符串的大小,并且具有静态存储持续时间(3.7).
Puf*_*fin 11
预处理器定义没有类型 - 它们基本上只是"粘贴"到它们出现的代码中.例如,您在声明中使用它;
int foo = LOGIC_ONE;
Run Code Online (Sandbox Code Playgroud)
然后它将被解释为整数.(编译器,在预处理器之后运行,只看到那个代码int foo = 1;)你甚至可以在一个诸如此类的grotty语句中使用它.
int foo##LOGIC_ONE;
Run Code Online (Sandbox Code Playgroud)
然后你将创建一个变量foo1.育!
以宏定义的另一个例子为例;
#define LOGIC_ONE hello
int LOGIC_ONE = 5;
printf("%d\n", hello);
Run Code Online (Sandbox Code Playgroud)
这是完全有效的,并声明一个名为hello的int,但表明定义没有"类型" - hello只是LOGIC_ONE在代码中遇到的地方被替换.
除非绝对必要,否则请避免使用预处理器宏.专业编码标准通常禁止或严格限制预处理器的使用.通常总是有比使用宏更好的方法.例如,考虑这些替代方案;
static const int LOGIC_ONE = 1;
enum { LOGIC_ONE = 1 };
Run Code Online (Sandbox Code Playgroud)
预处理器是学习者快速进入C语言的快捷方式.