函数的多重定义

时间:2017-06-27 20:40:19

标签: c++ macros

我定义了一个函数,用于在头文件中关闭调试标志时显示消息,如下所示:

#ifdef  NDEBUG

#define debug_msg(expr, msg)        (static_cast<void>(0))

#else /* Not NDEBUG.  */

#ifndef SHOW_DEBUG_H_
#define SHOW_DEBUG_H_

#include <stdio.h>
void _show_in_debug(const char *_file, unsigned int _line,
        const char *_function, const char *_msg)
{
    printf("%s\t%d\t%s\t%s\n", _file, _line, _function, _msg);
    fflush(NULL);
}

#endif

#define debug_msg(expr, msg)                \
  ((expr)                               \
   ? _show_in_debug(__FILE__, __LINE__, __func__, msg)  \
   : static_cast<void>(0))

#endif

当我将标题包含在多个文件中时,我收到以下错误:

  

`_show_in_debug的多重定义(char const *,unsigned int,char   const *,char const *)'

我不知道我在这里做错了什么,有什么帮助吗?

3 个答案:

答案 0 :(得分:3)

如果将该标题包含在多个.c文件中,则每个标题都将定义该函数。这就是错误所说的。

你应该做的只是在标题中声明函数(即只将原型放在那里;你应该总是这样)然后在单个.c文件中定义它(即将正文放在.c文件中) ,封装在与原型相同的开关中。

要更改为此标题:

/* ... as you quoted ... */
    void _show_in_debug(const char *_file, unsigned int _line,
        const char *_function, const char *_msg);
/* ... rest of what you quoted ... */

包含此代码的代码文件:

#incude <stdio.h>
#include "Yourheader.h"

#ifdef  NDEBUG
void _show_in_debug(const char *_file, unsigned int _line,
        const char *_function, const char *_msg)
{
    printf("%s\t%d\t%s\t%s\n", _file, _line, _function, _msg);
    fflush(NULL);
}

#endif

答案 1 :(得分:3)

即使使用包含警戒,您最终也会在每个编译单元中使用{strong>定义 _show_in_debug。然后将这些单元链接到多重定义错误。

对于这样的调试函数,将函数定义为static,使其在编译单元外不可见:

static void _show_in_debug(const char *_file, unsigned int _line,
        const char *_function, const char *_msg)
{
    printf("%s\t%d\t%s\t%s\n", _file, _line, _function, _msg);
    fflush(NULL);
}

答案 2 :(得分:2)

我假设您提供的文件头文件包含在多个源文件中。为什么这是个问题?这是因为您已在标头中定义了_show_in_debug()函数,而不是在标头中声明 并在源文件文件中定义它。这导致函数在包含标题的多个源文件中定义。

有关详细信息,请参阅http://www.cprogramming.com/declare_vs_define.html(特别参见&#34;常见案例&#34;部分)。