上下文:我正在编写一个非平凡的客户端服务器UDP组播程序,我正在一些无线节点上部署它。部署方法是我编写的一个脚本,它广播这些节点所在的网络,获取节点列表(基于IP地址),部署我的包,并安装它。我注意到,有时并不是所有节点在部署时都被检测到,而且我正在开发的最新包也没有安装。最终,在一个节点上运行的服务器可能比希望与服务器通信的客户端更早。因为服务器获取数据包,并根据该数据包中的条目分配内存,因此如果结构发生变化,服务器通常会在分段故障中崩溃。作为一种解决方案,我正在考虑在客户机和服务器之间发送的数据包中实现版本号,这样,如果服务器/客户端读取版本号不一样的数据包(或由于数据包的重组而成为垃圾),则忽略该数据包,更新日志,或者向原始发送方发送紧急数据包。
因此,我正在尝试找到在编译时获得这个“版本号”的最佳方法,该方法可以作为#define放在头中。我已经查找了__time__预处理宏,但这是一个字符串的形式。是否有一种方法可以在编译期间获得划时代的时间,这样我就可以将其隐藏为一个无符号的int (如果我正确地考虑了这一点,那么只有在136年后才会翻滚)?
抱歉,如果我搞不清楚。
发布于 2013-08-13 18:00:26
这取决于您的构建系统,但是如果您使用的是gmake,您可以这样做:
CXX_TIME = -DBUILDTIME=$(shell python -c "import time; print( int( time.time() ) )" )将其添加到其他编译器选项中,然后在代码中使用宏BUILDTIME。
(这假设您已经在path中安装了Python。如果没有,您可以安装它,或者使用已经安装的工具进行类似的操作。)
发布于 2020-12-11 10:33:18
您可以从__DATE__预处理宏中获得这个时代。
在getCompileTimeEpoch()函数下面,它又依赖于返回月份号的另外两个简单的辅助函数和将月份首字母缩写转换为小写的另一个函数。
令我费解的是,GCC开发人员是如何引入了一个具有人类可读的日期而不是一个时代的宏的,在这个宏中,任何关于日期的内容都可以以最大的可靠性导出。
如果需要将时间添加到时代中,您可以很容易地从__TIME__宏中添加时间。
我选择了这个解决方案,因为它将所有内容都保存在代码中,而不依赖于编译器选项。
char *tolowercase(char *letstr){
int l;
for(l=0;l<=strlen(letstr);l++){
if(letstr[l]>=65 && letstr[l]<=92){
letstr[l]=letstr[l]+32;
}
}
return letstr;
}
int getMonFromAbbr(char *abbr){
if (strlen(abbr) > 0)
tolowercase(abbr);
if ( strcmp(abbr, "jan") == 0 )
return 0;
if ( strcmp(abbr, "feb") == 0 )
return 1;
if ( strcmp(abbr, "mar") == 0 )
return 2;
if ( strcmp(abbr, "apr") == 0 )
return 3;
if ( strcmp(abbr, "may") == 0 )
return 4;
if ( strcmp(abbr, "jun") == 0 )
return 5;
if ( strcmp(abbr, "jul") == 0 )
return 6;
if ( strcmp(abbr, "aug") == 0 )
return 7;
if ( strcmp(abbr, "sep") == 0 )
return 8;
if ( strcmp(abbr, "oct") == 0 )
return 9;
if ( strcmp(abbr, "nov") == 0 )
return 10;
if ( strcmp(abbr, "dec") == 0 )
return 11;
return(-1);
}
// Convert from __DATE__ macro
uint64_t getCompileTimeEpoch(){
char date_macro[20]="";
strcpy(date_macro, __DATE__);
char *token;
int yea=0;
int mon=0;
int day=0;
token=strtok(date_macro, " ");
if (token != NULL){
mon=getMonFromAbbr(token);
token=strtok(NULL, " ");
if (token != NULL){
day=atoi(token);
token=strtok(NULL, " ");
if (token != NULL){
yea=atoi(token);
struct tm t;
time_t epoch_t;
t.tm_year = yea-1900; // Year - 1900
t.tm_mon = mon; // Month, where 0 = jan
t.tm_mday = day; // Day of the month
t.tm_hour = 0;
t.tm_min = 0;
t.tm_sec = 0;
t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown
epoch_t = mktime(&t);
return epoch_t;
}
}
}
return(-1);
}https://stackoverflow.com/questions/18215846
复制相似问题