【发布时间】:2021-12-09 16:27:41
【问题描述】:
我有一个函数f,它是:
void f(int x, int y, int z){
//bla bla bla
}
以及其他一些使用f的函数:
void g(int x, int y, int z){
f(x, 10, 10); //10, 10 are hard coded
}
void h(int x, int y){
f(x, y, 20); //20 is hard coded
}
重要提示: f 必须保持私密,并且对其他文件隐藏。
现在,在头文件中,我只是写了h 和g 的原型。一切正常。
我决定将#define 用于h 和g,因为它更简单、更标准。所以我把函数去掉了,写在头上:
#define h(x) f(x, 10, 10)
#define g(x, y) f(x, y, 10)
问题是,如您所知,我必须在标题中编写f 的原型。 f 必须是私有的。有什么方法可以在这种情况下使用#define 吗?比如使用#def, #undef, ...
【问题讨论】:
-
为什么要使用宏。如果有的话,最佳实践建议是尽可能避免使用宏。
-
宏并不比函数“更标准”。宏并不比函数“具有更高的优先级”。宏是否比函数“容易得多”是值得怀疑的。这个问题是基于错误的前提。要使函数保持私有,请不要在可见的宏中使用它。
-
考虑使用内联函数而不是宏
-
@MohammadKholghi
What's the problem with macros?- 它们有自己的位置,但是因为它们实际上(在 C/C++ 中)告诉预处理器在编译之前进行字符串替换,它们不是类型安全的并且可能导致当事情发生变化时会出现一些非常令人困惑的错误。Which one do you prefer?- 我绝对更喜欢做同样事情的整个函数,特别是考虑到编译器很可能会在任何调用站点内联它✌️ -
这是课程的马;当您为嵌入式系统进行开发时,您必须做出不同的权衡。你在程序大小(如果你内联函数会增加)和堆栈大小(如果函数没有内联会增加)方面都受到限制。