c-xc8警告:var的初始值不同



我遇到了一个编译器警告:

version.h:47: warning: (1478) initial value for "_svn_string_revision" differs to that in version.h:47

相应的.h版本文件如下所示:

#ifndef _VERSION_H_
#define _VERSION_H_
#define SVN_REVISION_NUMBER         31
const char *svn_string_revision      = "31"; // line 47
#endif //_VERSION_H_

用法:

main.c:

#include "version.h"
// I do not use svn_string_revision here.
// I only use SVN_REVISION_NUMBER
#pragma config IDLOC3=SVN_REVISION_NUMBER

其他文件.c:

#include "version.h"
// still no usage of svn_string_revision, only this:
EUSART_Write(SVN_REVISION_NUMBER);

到目前为止,这是描述性的和明确的。我认为问题在于const char字符串是在一个头文件中定义的,该头文件包含在多个源代码文件中。因此,编译器会看到多个"svn_string_prevision"变量,并将其视为重新声明。但通常情况下,该值应该始终相同。我的.h版本文件是一个自动生成的文件,在每次构建之前都会重新生成。

以前有人遇到过这种情况吗?我该如何处理?干净的方法是使用一个用version.c补充的version.h文件,其中的头声明

extern const char *svn_string_revision;

和源

const char *svn_string_revision = "31";

但这将需要我重写自动代码生成,而我希望避免这种情况。

长话短说,我的问题是:

  • 我对警告的理解正确吗
  • 既然我不想将.h版本拆分为.c和.h文件,我该如何优雅地避免这些警告呢

第一个解决方案:

static const char *svn_string_revision = "31";

static将使变量成为每个C文件的本地变量,因此不会发生冲突。由于它是一个只读常数,所以应该没问题。但是,这意味着程序中会有许多变量的副本。一个好的编译器可以优化这一点,但根据我的经验,我不确定XC8会做到这一点。

第二种解决方案,可能更好:

#define SVN_REVISION_NUMBER         31
#define STRINGIFY(s) #s
extern const char *svn_string_revision;
// in version.c
const char *svn_string_revision = STRINGIFY(SVN_REVISION_NUMBER);

或者只是:

#define SVN_REVISION_NUMBER         31
#define VERSION_STRING "31"
extern const char *svn_string_revision;
// in version.c
const char *svn_string_revision = VERSION_STRING;

您也可以只删除svn_string_revision并使用VERSION_STRING,但您应该先检查XC8不会创建该字符串的许多副本。

相关内容

  • 没有找到相关文章

最新更新