C代码版本指示

C code version indication

我的代码中有 2 个 enable/disable 特定方法的编译器选项,当我构建代码时,我将两个版本都构建为 .LIB 文件。但是当我查看这两个构建时,它们的输出看起来是一样的。我没有使用十六进制编辑器来比较二进制数据顺便说一句。

代码如下所示:

#define TEST_BUILD
//#define REL_BUILD

#ifdef TEST_BUILD
#define ENABLE_METHOD1
#define ENABLE_METHOD2
#endif

#ifdef REL_BUILD
#define ENABLE_METHOD3
#define ENABLE_METHOD4
#endif

问题是,我怎样才能指示哪个文件指示哪个版本的构建?有什么通用的方法吗?

我是这样想的:

#ifdef TEST_BUILD
char *caCodeVersion = "V01.01.16T";
#endif
#ifdef REL_BUILD
char *caCodeVersion = "V01.01.16R";
#endif

当我查看二进制输出时,我会在代码中看到这个字符串并知道它包含哪个版本和构建。还有其他方法可以做这样的事情吗?

顺便说一句,输出文件需要同名。

我可以推荐这个方法:

#ifdef TEST_BUILD
    func_vers_V01.01.16T(void )
    {
         //Dummy package
    }
#endif

#ifdef REL_BUILD
    func_vers_V01.01.16R(void )
    {
         //Dummy package
    }
#endif

现在可以使用nm命令或其他相关命令来读取二进制文件中的符号了。

如果 func_vers_V01.01.16T 符号存在而不是 Test Build else Rel build.

希望这会有所帮助。

char *caCodeVersion = "V01.01.16R";

这是一种常用的方法。另一种可能性是使用许多编译器中存在的 #ident pragma:

#ident "v01.01.16R"

但是,这个 pragma 不是标准的。确保你的编译器支持它!

为了使最初的 char* 方法更可靠地工作,将常量放入一个源文件中,该文件也定义了其他(使用的)东西,这样目标文件就不会被丢弃。

现在我已经在我的一个试验中取得了成功,所以这是答案之一。

定义为:

#ifdef TEST_BUILD
char *caCodeVersion = "V01.01.16T";
#endif
#ifdef REL_BUILD
char *caCodeVersion = "V01.01.16R";
#endif

还有关键部分,你需要在你的代码中使用这个变量,让它远离编译器优化。

只是我在我的一个函数中使用了它,memset 为 char 数组的零。

strcpy(caBuffer, caCodeVersion);
memset(caBuffer, 0x00, sizeof(caBuffer));

因此编译器将 caCodeVersion 变量保存在输出二进制文件中。

如果我用文本编辑器打开输出二进制文件并找到 "V01.01.16T",它是代码的测试版本。否则就是发行版。