xc8 警告:var 的初始值不同
xc8 warning: initial value for var differs
我已经 运行 遇到编译器警告:
version.h:47: warning: (1478) initial value for "_svn_string_revision" differs to that in version.h:47
相应的 version.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
otherfile.c:
#include "version.h"
// still no usage of svn_string_revision, only this:
EUSART_Write(SVN_REVISION_NUMBER);
到目前为止,这是描述性的和清晰的。我认为问题在于 const char 字符串是在 header 文件中定义的,该文件包含在多个源代码文件中。因此编译器看到多个 "svn_string_revision" 变量并将其视为重新声明。但通常该值应该始终相同。我的 version.h 文件是一个自动生成的文件,在每次构建之前都会重新生成。
以前有人遇到过这种情况吗,我该如何处理?
干净的方法是使用 version.h 文件并辅以 version.c,其中 header 声明
extern const char *svn_string_revision;
和来源
const char *svn_string_revision = "31";
但这需要我重写自动代码生成,我想避免这种情况。
长话短说,我的问题是:
- 我对警告的理解是否正确?
- 考虑到我不想将 version.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 不会创建该字符串的许多副本。
我已经 运行 遇到编译器警告:
version.h:47: warning: (1478) initial value for "_svn_string_revision" differs to that in version.h:47
相应的 version.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
otherfile.c:
#include "version.h"
// still no usage of svn_string_revision, only this:
EUSART_Write(SVN_REVISION_NUMBER);
到目前为止,这是描述性的和清晰的。我认为问题在于 const char 字符串是在 header 文件中定义的,该文件包含在多个源代码文件中。因此编译器看到多个 "svn_string_revision" 变量并将其视为重新声明。但通常该值应该始终相同。我的 version.h 文件是一个自动生成的文件,在每次构建之前都会重新生成。
以前有人遇到过这种情况吗,我该如何处理? 干净的方法是使用 version.h 文件并辅以 version.c,其中 header 声明
extern const char *svn_string_revision;
和来源
const char *svn_string_revision = "31";
但这需要我重写自动代码生成,我想避免这种情况。
长话短说,我的问题是:
- 我对警告的理解是否正确?
- 考虑到我不想将 version.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 不会创建该字符串的许多副本。