C代码版本指示

时间:2016-03-28 06:10:11

标签: c versioning

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

代码如下所示:

#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

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

顺便说一句,输出文件必须是同名的。

3 个答案:

答案 0 :(得分:0)

我可以建议这种方法:

#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。

希望这会有所帮助。

答案 1 :(得分:0)

char *caCodeVersion = "V01.01.16R";

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

#ident "v01.01.16R"

然而,这个实用主义并非标准。确保您的编译器支持它!

要使原始char*方法更可靠地工作,请将常量放入定义其他(使用过的)内容的源文件中,这样就不会丢弃目标文件。

答案 2 :(得分:0)

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

定义将是:

#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",它就是代码的测试版本。否则它是发布版本。