C++;:选项及其优缺点 C++中实现内联代码的方法有哪些?我只能考虑宏和内联函数。在C++11/17/20中是否有更多的替代方案(例如lambda)?利与弊 // do macros still make sense in modern C++ standards? #define square(x) ((x)*(x)) // is this a good alternative to macros? template <class T> inline T square(T x) { return x * x; } 在现代C++标准中,宏还是有意义的? #定义正方形(x)((x)*(x)) //这是宏的好替代方案吗? 模板内联T平方(tx){return x*x;}
编辑:将注释从“宏是否仍受鼓励…”改为“宏是否仍有意义…”它闻起来像是“基于意见”,有些人更不喜欢宏 宏的常见缺点:C++;:选项及其优缺点 C++中实现内联代码的方法有哪些?我只能考虑宏和内联函数。在C++11/17/20中是否有更多的替代方案(例如lambda)?利与弊 // do macros still make sense in modern C++ standards? #define square(x) ((x)*(x)) // is this a good alternative to macros? template <class T> inline T square(T x) { return x * x; } 在现代C++标准中,宏还是有意义的? #定义正方形(x)((x)*(x)) //这是宏的好替代方案吗? 模板内联T平方(tx){return x*x;},c++,C++,编辑:将注释从“宏是否仍受鼓励…”改为“宏是否仍有意义…”它闻起来像是“基于意见”,有些人更不喜欢宏 宏的常见缺点: 他们评估参数的次数与遇到的次数相同(在您的案例中是两次) 更容易出错(不要忘记括号) 忽略程序结构(不属于名称空间,现在您不能将任何其他名称命名为square,即使是作为类方法 为了缓解后一个问题,请使用所有的大写字母命名宏,不要命名其他类似的名称 宏的优点是: C兼容性 能够在宏中包含任意代码段,而不仅仅是(内联)函数 它闻起来像是“基于意见的”,有些人更不喜欢宏 宏的常
- 他们评估参数的次数与遇到的次数相同(在您的案例中是两次)
- 更容易出错(不要忘记括号)
- 忽略程序结构(不属于名称空间,现在您不能将任何其他名称命名为
,即使是作为类方法square
- C兼容性
- 能够在宏中包含任意代码段,而不仅仅是(内联)函数
- 他们评估参数的次数与遇到的次数相同(在您的案例中是两次)
- 更容易出错(不要忘记括号)
- 忽略程序结构(不属于名称空间,现在您不能将任何其他名称命名为
,即使是作为类方法square
- C兼容性
- 能够在宏中包含任意代码段,而不仅仅是(内联)函数
// are macros still encouraged in modern C++ standards?
#define square(x) ((x)*(x))
namespace My {
int square(int x) { return x * x; }
} // namespace My
所以,伊姆霍,答案是否定的
请记住,在C(引入预处理器的地方)中,没有名称空间,直到现在还没有添加名称空间
演示: 预处理:
namespace My {
int ((int x)*(int x)) { return x * x; }
}
int main()
{
std::cout << My::((10)*(10));
}
宏有一个很大的缺点:它们与名称空间无关 想象一下,如果我扩展您的示例,会发生什么:
// are macros still encouraged in modern C++ standards?
#define square(x) ((x)*(x))
namespace My {
int square(int x) { return x * x; }
} // namespace My
所以,伊姆霍,答案是否定的
请记住,在C(引入预处理器的地方)中,没有名称空间,直到现在还没有添加名称空间
演示: 预处理:
namespace My {
int ((int x)*(int x)) { return x * x; }
}
int main()
{
std::cout << My::((10)*(10));
}
< /P> < P>宏从来没有被鼓励。考虑宏与函数的作用不一样,例如:
int foo() {
static int x = 0;
++x;
return x;
}
std::cout << square(foo());
intfoo(){
静态int x=0;
++x;
返回x;
}
STD::CUT宏从来没有被鼓励。考虑宏不做与函数类似的,例如:
int foo() {
static int x = 0;
++x;
return x;
}
std::cout << square(foo());
intfoo(){
静态int x=0;
++x;
返回x;
}
std::cout//这是宏的一个好替代方案吗?
模板内联T平方(tx){return x*x;}
是的,这是首选的方式(虽然模板通常不需要内联,而显式模板专门化和实例化需要内联,但保持一致并写出其中的含义是可以的)
还要注意,constexpr
函数和构造函数是隐式内联的
还要注意的是,在虚拟重载的上下文中使用final
(如果合适)甚至可以帮助内联一些虚拟方法(请查看此处的一些示例和解释)。//这是宏的好替代方案吗?
模板内联T平方(tx){return x*x;}
是的,这是首选的方式(虽然模板通常不需要内联,而显式模板专门化和实例化需要内联,但保持一致并写出其中的含义是可以的)
还要注意,constexpr
函数和构造函数是隐式内联的
还注意到,在虚拟重载的上下文中使用<代码>最终< /COD>(C++)可以帮助甚至连一些虚拟的方法(对于一些例子和解释来检查)。
宏应该是C++中的最后一个工具。
它们不是天生的坏,但是编译器没有检查它们
宏扩展比编译前的文本替换稍微多一些,因此您编写的代码只有在扩展后才会被检查。
这意味着,如果您犯了错误,那么查找错误可能会更困难,调试也会更困难,因为您将无法跳转到宏代码中。
此外,您还必须小心使用括号和多重求值
最后但并非最不重要的是,其他答案所指出的所有其他的事情也适用。
<宏应该是C++的最后一个工具。
它们不是天生的坏,但是编译器没有检查它们
宏扩展比编译前的文本替换稍微多一些,因此您编写的代码只有在扩展后才会被检查。
这意味着,如果您犯了错误,那么查找错误可能会更困难,调试也会更困难,因为您将无法跳转到宏代码中。
此外,您还必须小心使用括号和多重求值
最后但并非最不重要的一点是,其他答案所指出的所有其他问题也适用。另请参见“宏还在被鼓励吗?”什么时候被鼓励使用宏?@Jarod42可能您是seriuos,但您让我发笑:D incursed可能不是正确的词,但在内联代码场景中,它们是“标准的”宏不是用来替换函数的,宏不是函数,而是函数的思考导致了问题,其中一些细节是BeloWi看到的宏可能的C++解决方案的处理方法(简化变量/函数的方法(如无反射),提供源定位的方法(<代码>