如何将 __DATE__ 和 __TIME__ 预定义宏作为两个整数使用,然后进行字符串化? [英] How to use __DATE__ and __TIME__ predefined macros in as two integers, then stringify?

查看:7
本文介绍了如何将 __DATE__ 和 __TIME__ 预定义宏作为两个整数使用,然后进行字符串化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想要使用 __ DATE __ 和 __ TIME __ 作为整数,以便在编译时为我的代码提供自动版本.

Want to use __ DATE __ and __ TIME __ as integer for giving automated version to my code in compile time.

#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)

#define DATE_as_int_str useD(__DATE__) // What can be done ?
#define TIME_as_int_str useT(__TIME__) // What can be done ?

#define VERSION 1.4

#define COMPLETE_VERSION STR_VALUE(VERSION) "." DATE_as_int_str "." TIME_as_int_str

并在 const unsigned char [] 中获取 COMPLETE_VERSION 作为字符串.

and get COMPLETE_VERSION as string in a const unsigned char [].

const unsigned char completeVersion[] = ?? COMPLETE_VERSION;

应该输出 1.4.1432.2234 的东西.

一种可能的解决方案可能是但没有奏效: 转换-日期-to-unsigned-int

One of the possible solution could be but did not work: convert-date-to-unsigned-int

在编译时间的上下文中 convertint-date-and-time-string-to-just-integers-in-c 可以参考 扩展和字符串化-如何获得-marco-name-not-its-value

In context of compile time convertint-date-and-time-string-to-just-integers-in-c One can refer expanssion-and-stringification-how-to-get-the-marco-name-not-its-value

推荐答案

如果您可以使用 C++ 编译器来构建您想要包含您的版本字符串的目标文件,那么我们可以做您想要的!这里唯一的魔力是 C++ 允许您使用表达式来静态初始化数组,而 C 不允许.表达式需要在编译时完全可计算,但这些表达式是,所以没问题.

If you can use a C++ compiler to build the object file that you want to contain your version string, then we can do exactly what you want! The only magic here is that C++ allows you to use expressions to statically initialize an array, while C doesn't. The expressions need to be fully computable at compile time, but these expressions are, so it's no problem.

我们一次构建一个字节的版本字符串,并得到我们想要的.

We build up the version string one byte at a time, and get exactly what we want.

// source file version_num.h

#ifndef VERSION_NUM_H

#define VERSION_NUM_H


#define VERSION_MAJOR 1
#define VERSION_MINOR 4


#endif // VERSION_NUM_H

<小时>

// source file build_defs.h

#ifndef BUILD_DEFS_H

#define BUILD_DEFS_H


// Example of __DATE__ string: "Jul 27 2012"
//                              01234567890

#define BUILD_YEAR_CH0 (__DATE__[ 7])
#define BUILD_YEAR_CH1 (__DATE__[ 8])
#define BUILD_YEAR_CH2 (__DATE__[ 9])
#define BUILD_YEAR_CH3 (__DATE__[10])


#define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
#define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
#define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
#define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
#define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
#define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
#define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
#define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
#define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
#define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')


#define BUILD_MONTH_CH0 
    ((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')

#define BUILD_MONTH_CH1 
    ( 
        (BUILD_MONTH_IS_JAN) ? '1' : 
        (BUILD_MONTH_IS_FEB) ? '2' : 
        (BUILD_MONTH_IS_MAR) ? '3' : 
        (BUILD_MONTH_IS_APR) ? '4' : 
        (BUILD_MONTH_IS_MAY) ? '5' : 
        (BUILD_MONTH_IS_JUN) ? '6' : 
        (BUILD_MONTH_IS_JUL) ? '7' : 
        (BUILD_MONTH_IS_AUG) ? '8' : 
        (BUILD_MONTH_IS_SEP) ? '9' : 
        (BUILD_MONTH_IS_OCT) ? '0' : 
        (BUILD_MONTH_IS_NOV) ? '1' : 
        (BUILD_MONTH_IS_DEC) ? '2' : 
        /* error default */    '?' 
    )

#define BUILD_DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')
#define BUILD_DAY_CH1 (__DATE__[ 5])



// Example of __TIME__ string: "21:06:19"
//                              01234567

#define BUILD_HOUR_CH0 (__TIME__[0])
#define BUILD_HOUR_CH1 (__TIME__[1])

#define BUILD_MIN_CH0 (__TIME__[3])
#define BUILD_MIN_CH1 (__TIME__[4])

#define BUILD_SEC_CH0 (__TIME__[6])
#define BUILD_SEC_CH1 (__TIME__[7])


#if VERSION_MAJOR > 100

#define VERSION_MAJOR_INIT 
    ((VERSION_MAJOR / 100) + '0'), 
    (((VERSION_MAJOR % 100) / 10) + '0'), 
    ((VERSION_MAJOR % 10) + '0')

#elif VERSION_MAJOR > 10

#define VERSION_MAJOR_INIT 
    ((VERSION_MAJOR / 10) + '0'), 
    ((VERSION_MAJOR % 10) + '0')

#else

#define VERSION_MAJOR_INIT 
    (VERSION_MAJOR + '0')

#endif

#if VERSION_MINOR > 100

#define VERSION_MINOR_INIT 
    ((VERSION_MINOR / 100) + '0'), 
    (((VERSION_MINOR % 100) / 10) + '0'), 
    ((VERSION_MINOR % 10) + '0')

#elif VERSION_MINOR > 10

#define VERSION_MINOR_INIT 
    ((VERSION_MINOR / 10) + '0'), 
    ((VERSION_MINOR % 10) + '0')

#else

#define VERSION_MINOR_INIT 
    (VERSION_MINOR + '0')

#endif



#endif // BUILD_DEFS_H

<小时>

// source file main.c

#include "version_num.h"
#include "build_defs.h"

// want something like: 1.4.1432.2234

const unsigned char completeVersion[] =
{
    VERSION_MAJOR_INIT,
    '.',
    VERSION_MINOR_INIT,
    '-', 'V', '-',
    BUILD_YEAR_CH0, BUILD_YEAR_CH1, BUILD_YEAR_CH2, BUILD_YEAR_CH3,
    '-',
    BUILD_MONTH_CH0, BUILD_MONTH_CH1,
    '-',
    BUILD_DAY_CH0, BUILD_DAY_CH1,
    'T',
    BUILD_HOUR_CH0, BUILD_HOUR_CH1,
    ':',
    BUILD_MIN_CH0, BUILD_MIN_CH1,
    ':',
    BUILD_SEC_CH0, BUILD_SEC_CH1,
    ''
};


#include <stdio.h>

int main(int argc, char **argv)
{
    printf("%s
", completeVersion);
    // prints something similar to: 1.4-V-2013-05-09T15:34:49
}

这不完全是您要求的格式,但我仍然不完全理解您希望如何将天数和小时数映射到整数.我认为很清楚如何使它产生任何所需的字符串.

This isn't exactly the format you asked for, but I still don't fully understand how you want days and hours mapped to an integer. I think it's pretty clear how to make this produce any desired string.

这篇关于如何将 __DATE__ 和 __TIME__ 预定义宏作为两个整数使用,然后进行字符串化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆