2017-01-27 72 views
0

在我的代码使用预处理宏预处理宏调用内联函数

#define BAR(x) x+2 

,但后来我意识到,我需要一个内联函数在它的位置,并结束了与下面的代码

#define BAR(x) in_bar(x) 

inline double in_bar(double x) { 
    return x + 2; 
} 

void main() { 
    std::cout << BAR(2) << std::endl; 
} 

是它有效吗?它似乎工作,但不会导致任何潜在的问题?

+2

为什么保持MACRO? – Jarod42

+0

@ Jarod42因为否则我需要在多个地方编辑多个文件,并且它根本就不值得浪费时间... – Tim

+3

'内联双BAR(double d){return x + 2;}'? – Jarod42

回答

3

这是有效的,但没有必要。请直接从main调用内联函数。此外,main应该返回int

inline double in_bar(double x) { 
    return x + 2; 
} 

int main() { 
    std::cout << in_bar(2) << std::endl; 
} 
+0

答案是正确的,如果您只评论了为什么问题中的方法是有效的,我会很乐意接受您的答案。最后,我最终使用了内联函数并根据您和注释中的建议编辑了代码。 – Tim

+0

@Tim的人已经建议这种方法是有效的,因为没有逻辑/语法错误并编译成相同的汇编代码。宏“BAR”是多余的。 – Shreevardhan

+0

我知道它是多余的,我的问题是,如果编译器能正确处理所描述场景中的内联函数(因为宏和内联函数要求编译器执行相同的操作)。 – Tim

1

你原来的宏被打破,并使用功能将纠正。

E.g.如果有人写了bar(1<<2)*4它会生成1 < < 2 + 2 * 4,这不是你所期望的。

如果您的某些代码依赖于该不良行为,结果将会有所不同(但在大多数情况下,函数变体会更好)。 正如其他人所建议的那样 - 只要让BAR成为内联函数,不需要任何宏。

BTW:适当的宏将

#define BAR(x) ((x)+2) 
+3

或者原始宏是正确的,并且使用函数会导致行为发生不希望的变化... –

+0

对于那些依赖于破碎代码的客户端代码 - 我在答案中补充说,效果是相同的,即客户在更改后会变得破碎。但是没有任何文档描述宏的行为,我说宏已经坏了。 –