Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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++_Visual Studio 2010 - Fatal编程技术网

C++ 在C+中设计带调试信息和不带调试信息的函数的正确方法+;

C++ 在C+中设计带调试信息和不带调试信息的函数的正确方法+;,c++,visual-studio-2010,C++,Visual Studio 2010,当我在类中设计一个函数时,我想平衡我可以从中提取的信息。有些信息可能对调试有用,但不必作为函数的输出。我举以下例子: class A { bool my_func(int arg1, int &output, std::vector<int> &intermediate_vec); { // do something } } 我只是想知道是否有更好的方法来做这项工作。谢谢 使用日志库并在调试日志级别记录这些中间值,而不是将它们作为输出收集。如

当我在类中设计一个函数时,我想平衡我可以从中提取的信息。有些信息可能对调试有用,但不必作为函数的输出。我举以下例子:

class A
{
   bool my_func(int arg1, int &output, std::vector<int> &intermediate_vec);
  {
     // do something
  }
}

我只是想知道是否有更好的方法来做这项工作。谢谢

使用日志库并在调试日志级别记录这些中间值,而不是将它们作为输出收集。

如果您计划在某些调试后处理中使用
中间值,则可能会比较棘手。但是,如果您只打算使用它来打印结果,那么就更容易了

在你的想法中,我最不喜欢的是让你在两个不同的地方做一些看起来完全相同的事情。这是非常容易出错的,并开始发展成为一个真正的PIA,这时您将不得不使用十几个方法维护十几个类,其中一半有一些调试副本。逻辑上的每一个变化都必须以连贯的方式进行两次

当我遇到类似的问题时,我正在考虑以下事项,以避免在执行条件日志记录和/或附加检测时逻辑加倍

#定义调试/NDEBUG
您只有一个带有一些预处理器条件的代码副本

模板
。 效果基本相同,但语义不同

模板方法可能会使编码稍微复杂一些,但它允许在运行时使用这两个版本,这可能会很方便。
#define
方法根本不会改变API,但是如果您想要一些奇特的选择性或多级调试,那么在设计代码时确实需要考虑

当我必须有安全版本和快速版本的例程时,两个函数方法在我的用例中是可以的。保险箱做了一些检查,然后打电话给快速数字运算器。如果在循环中使用数字处理器,或者在内部安全地假设您可以跳过检查,那么这将非常有用

如果调试版本比较慢(例如,因为需要初始化并填充一个长向量),那么您可能不想在发布代码中调用它。日志记录也是如此。如果您确实需要输出一个数字,但在调试版本中,您最终将打印兆字节的数据(例如,计算向量的范数并打印向量本身),您将希望使用条件日志记录

总的来说,这看起来更像这样:

class A
{
    bool my_func(int arg1, int &output, std::vector<int> &intermediate_vec);
  {
      if(DEBUG) {//fill in the vector}
      // do something
      if(DEBUG) {//print out some fancy stuff}

  }
  // invoked by other programs 
  bool my_func(int arg1, int &output);
  {
    std::vector<int> intermediate_vec;
    return my_func(arg1, output, intermediate_vec);
  }
}
A类
{
bool my_func(int arg1、int和output、std::vector和intermediate_vec);
{
if(DEBUG){//填入向量}
//做点什么
如果(调试){//打印出一些有趣的东西}
}
//被其他程序调用
bool my_func(int arg1,int&output);
{
std::载体中间载体;
返回我的函数(arg1,输出,中间向量);
}
}
当然,您可以在调试中使用短调用,但是您无法获得向量。或在无调试模式下完全调用,但是
中间\u vec
将没有意义


任何可以避免复制粘贴应用程序逻辑的东西。我这样做了,当涉及到更改逻辑时,我感到非常痛苦。

函数的逻辑需要中间工具,还是只是为了收集一些你不需要的额外信息?例如,您的函数的第二个版本只声明一个
中间版本并将其传递给第一个版本有意义吗?@Vaughn Cato这正是我正在做的。您的方法有什么缺点?与@Sebastian Redl建议的相比,缺点是我将拥有比需要更多的函数。@Vaughn Cato我已经更改了代码。
class A
{
    bool my_func(int arg1, int &output, std::vector<int> &intermediate_vec);
  {
      if(DEBUG) {//fill in the vector}
      // do something
      if(DEBUG) {//print out some fancy stuff}

  }
  // invoked by other programs 
  bool my_func(int arg1, int &output);
  {
    std::vector<int> intermediate_vec;
    return my_func(arg1, output, intermediate_vec);
  }
}