我已经搜索过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 ++如何将参数隐式转换为比较器,例如<?还提出了,但仅描述了隐式强制转换如何与两种类型进行比较。由于宏实际上没有类型,因此我不确定是否适用。
该预处理器扩展宏编译器甚至看到任何东西之前。通过转至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
与<
操作。由于i
和40
都是算术类型,因此将执行常规的算术转换,在这种情况下仍将为int。对于C99,这部分6.3.1.8
和C ++第5部分将介绍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句