C 宏和循环中的函数 定义和(x,y)((x)+(y)) 作废打印(){ 对于(int i=0;i

C 宏和循环中的函数 定义和(x,y)((x)+(y)) 作废打印(){ 对于(int i=0;i,c,macros,C,Macros,对于非常简单的计算,调用函数可能比实际计算本身有更多的开销;在循环中,情况更糟 但是,您需要仔细定义函数替换宏,以便只对其参数求值一次 #define SUM(x,y) ((x)+(y)) void print(){ for(int i=0;i<10;i++) printf("sum=%d\n", SUM(i,i+1)); } 您这样调用它,它将扩展为(i+++)(i+++),这将在C中导致未定义的行为。这就是为什么内联函数比宏更可取的原因。内联函数只对其参数求值一次。不,它

对于非常简单的计算,调用函数可能比实际计算本身有更多的开销;在循环中,情况更糟

但是,您需要仔细定义函数替换宏,以便只对其参数求值一次

#define SUM(x,y) ((x)+(y))
void print(){
  for(int i=0;i<10;i++)
    printf("sum=%d\n", SUM(i,i+1));
}

您这样调用它,它将扩展为
(i+++)(i+++)
,这将在C中导致未定义的行为。这就是为什么内联函数比宏更可取的原因。内联函数只对其参数求值一次。

不,它只是混淆。“我读了”哪里?请引用。宏的一个好处是不必为了处理不同的类型而复制代码。如果
SUM
是一个函数,您的示例也将是未定义的行为。最好在第一段中提到内联函数,并提及它们可以避免调用开销。@potatosatter我的目的是给出一个d在第一段中直接回答原帖中的问题。在下一段中指出可能的陷阱、备选方案和其他附加信息。这是你的特权。就个人而言,如果一个备选方案由于问题主题的严重陷阱而几乎一直处于优势地位,我将给予它最高的评价。@Potatoswa好的。我们在这里不仅是为了回答问题,更重要的是为了分享我们的经验。下次我尝试回答问题时,我将采用这种回答方式。谢谢。
#define DOUBLE(i) ((i) + (i))