【发布时间】:2014-07-31 13:54:33
【问题描述】:
我已经搜索过 SO,但没有找到这个特定问题的答案。如果已经回答,请见谅。
如果您有以下情况:
#define MACRO 40
您不会将它分配给您在循环中使用它的变量:
for(int i = 0; i < MACRO; i++) {...
然后,perprocessor 创建:
for(int i = 0; i < 40; i++) {...
由于比较类型为int i,编译器是否会将其隐式转换为int?我看过这个问题Type of #define variables,Edgar Bonet 的很多答案暗示编译器选择如何处理宏有一个顺序?
这个问题,How does C++ implicitly cast arguments to a comparator such as <?,也有人建议,但只描述了隐式转换如何与两种类型进行比较。由于宏实际上没有类型,我不确定这是否适用。
【问题讨论】:
-
40已经是int。 -
A C 宏只是一个文本替换。
-
C 宏只是文本替换。它的行为就像你在那里输入了
40。 -
编译器完全不知道
40来自宏。在预编译器完成替换后,编译器会正确分析代码。 -
宏没有类型,但有替换文本,但
40有。扩展宏后,它的行为就像您输入了 text/。
标签: c++ c macros types c-preprocessor