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