【问题标题】:How define a function with a parameter dependant from a symbol debug?如何定义一个函数,其参数依赖于符号调试?
【发布时间】:2017-06-16 17:23:14
【问题描述】:

我用 -D 编译器选项定义了一个符号调试:-DDEBUG_VALUE 我想要一个函数,其中参数的存在取决于符号调试标志的定义或更少。

即如果定义了 DEBUG_VALUE 我有

my_function(int parameter1  ,int  my_parameter_dependant)

否则

my_function(int parameter1)

这样

my_function(int parameter1  #ifdef DEBUG_VALUE , int my_parameter_dependant #endif)

我明白了

 error: stray ‘#’ in program
 error: expected ‘,’ or ‘...’ before ‘ifdef’

我该如何解决? 提前致谢!

(我在 Unix 系统上使用 C++ 编译器)

【问题讨论】:

  • 我很确定预处理器指令必须在自己的行中
  • @Justin 因此,我不能以其他方式吗??

标签: c++ c++11 compiler-errors compiler-flags compiler-options


【解决方案1】:

你可以用不同的方式声明函数...

 #if defined( DEBUG_VALUE )
     void my_function( int parameter1, int my_parameter_dependent );
 #else
     void my_function( int parameter1 );
 #endif

创建嵌入式宏

 # if defined( DEBUG_VALUE )
         #define DEPENDENT_PARAM( x )   x 
 # else
         #define DEPENDENT_PARAM( x )
 #endif
 void my_function( int parameter1  DEPENDENT_PARAM(, int my_parameter_dependent) );

这意味着宏中的文本被预处理器咀嚼,并且被隐藏

或者你可以声明调试数据

  #if defined( DEBUG_VALUE )
      #define EXTRA_DEBUG  , int my_parameter_dependent  
  #else
      #define EXTRA_DEBUG
  #endif
  void my_function( int parameter1 EXTRA_DEBUG );

它们都有自己的优点,这取决于灵活性和改变了多少功能。

【讨论】:

  • DEPENDENT_PARAM 给我的印象是解决这个特殊问题的好方法(尽管在这种情况下,我认为像 DEBUG_PARAM 这样的不同名称可能会更好)。
  • 我宁愿称它为DEBUG_ONLY,因为它的使用不仅限于参数。事实上,在名称中包含_PARAM 会让我感到困惑,因为我可能会想省略逗号分隔符。 (警告:MFC 有这样一个DEBUG_ONLY 宏,所以要小心可能的名称冲突。)
【解决方案2】:

您不能在一行中嵌入预处理器宏。他们需要自己的专线。所以你必须把这个声明分成不同的行:

#ifdef DEBUG_VALUE
    void my_function(int parameter1, int my_parameter_dependant);
#else
    void my_function(int parameter1);
#endif

或者,如果您想变得聪明并DRY,请利用 C++ 在语句和空格方面的巨大灵活性:

void my_function(int parameter1
#ifdef DEBUG_VALUE
                , int my_parameter_dependant
#endif
                );

【讨论】:

  • 第三种方法是使用适当定义的辅助宏:void my_function(int parameter1 DEBUG_VALUE_ONLY(int my_parameter_dependent))
  • 嗯,是的,唯一比 1 个宏更好的是 2 个宏!
  • @CodyGray 太好了,您的第二个解决方案。我知道第一个解决方案,但这并不重要,因为我必须复制很多行代码。第二种方法有效。谢谢。
  • 我强烈建议不要使用第二个版本;它比第一次更容易减少理解。无论如何,像这样的预处理器诡计很容易让人难以理解,尤其是当您开始需要另一种配置时
  • @Justin 我只在调试模式下使用它。当代码准备好发布时,此预处理器指令将消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2015-02-09
  • 1970-01-01
  • 2012-04-20
  • 2022-11-14
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多