Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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++ - Fatal编程技术网

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++解决方案的处理方法(简化变量/函数的方法(如无反射),提供源定位的方法(<代码>