我定义了一个函数,用于在头文件中关闭调试标志时显示消息,如下所示:
#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 *)'
我不知道我在这里做错了什么,有什么帮助吗?
答案 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;部分)。