C宏是否隐式转换?

罗拉兹

我已经搜索过SO,但尚未找到针对这些特定问题的答案。如果已经回答了,请原谅我。

如果您具有以下条件:

#define MACRO  40

您无需将其分配给在循环中使用的变量:

for(int i = 0; i < MACRO; i++) {...

然后,perprocessor创建:

for(int i = 0; i < 40; i++) {...

由于比较是使用type进行的,因此编译器是否会将其隐式转换为int int i我已经看过这个问题#define变量的类型,并且在Edgar Bonet身上有很多答案暗示着编译器选择如何处理宏的顺序?

这个问题C ++如何将参数隐式转换为比较器,例如<?还提出了,但仅描述了隐式强制转换如何与两种类型进行比较。由于宏实际上没有类型,因此我不确定是否适用。

沙菲克·雅格慕(Shafik Yaghmour)

预处理器扩展宏编译器甚至看到任何东西之前。通过转至C99标准草案的“6.4.8 预处理编号”部分,我们可以看到预处理编号没有类型,它表示:

预处理编号没有类型或值。成功转换(作为转换阶段7的一部分)到浮动常量令牌或整数常量令牌后,它都会获取。

C ++标准草案中的同一部分是2.10

正如我们在C预处理器Wikipedia文章中所见,宏扩展发生在阶段4中。

C99标准草案“6.4.4.1 整数常量”部分和第5段中的下表介绍了C术语中的整数常量和C ++术语中的整数文字的转换

整数常量的类型是对应列表的第一个,可以在其中表示其值

                                           八进制或十六进制
后缀小数常数常数
-------------------------------------------------- -------------------------
无int int
              long int unsigned int
              long long int long int                                
                                            无符号长整数
                                            long long int
                                            unsigned long long int
-------------------------------------------------- -------------------------
u或U unsigned int unsigned int
              无符号长整数无符号长整数
              unsigned long long int无符号的long long int
-------------------------------------------------- -------------------------
l或L long int long int
              long long int无符号long int
                                            long long int
                                            unsigned long long int
-------------------------------------------------- -------------------------
u或U都无符号long int无符号long int
和l或L unsigned long long int unsigned long long int
-------------------------------------------------- -------------------------
ll或LL long long int long long int
                                            不知所措long long int
-------------------------------------------------- -------------------------
u或U unsigned long long int unsigned long long int
和ll或LL
-------------------------------------------------- -------------------------

表是此答案的修改后的版本C ++标准草案中涵盖此内容的部分2.14.2是也具有类似表格的部分。

因此,在您的示例40中没有后缀,它是一个十进制常量,可以从表的该部分表示的第一个类型是int

在这一点上,我们现在结束了使用的效果40<操作。由于i40都是算术类型,因此将执行常规的算术转换,在这种情况下仍将为int对于C99,这部分6.3.1.8和C ++第5部分将介绍

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章