- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
想使用 __ DATE __ 和 __ 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
并获取 COMPLETE_VERSION
作为 const unsigned char []
中的字符串。
const unsigned char completeVersion[] = ?? COMPLETE_VERSION;
应该输出 1.4.1432.2234 东西。
可能的解决方案之一是但没有奏效: convert-date-to-unsigned-int
在编译时上下文中 convertint-date-and-time-string-to-just-integers-in-c 可以引用 expanssion-and-stringification-how-to-get-the-marco-name-not-its-value
最佳答案
如果您可以使用 C++ 编译器来构建您想要包含版本字符串的目标文件,那么我们就可以完全按照您的要求进行操作!这里唯一的魔力是 C++ 允许您使用表达式静态初始化数组,而 C 不允许。表达式需要在编译时完全可计算,但这些表达式是,所以没问题。
我们一次构建一个字节的版本字符串,并得到我们想要的。
// 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,
'\0'
};
#include <stdio.h>
int main(int argc, char **argv)
{
printf("%s\n", completeVersion);
// prints something similar to: 1.4-V-2013-05-09T15:34:49
}
这不是您要求的格式,但我仍然不完全理解您希望将天数和小时数映射到整数的方式。我认为很清楚如何使它产生任何所需的字符串。
关于c - 如何将 __DATE__ 和 __TIME__ 预定义宏用作两个整数,然后进行字符串化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11697820/
C 有一个预定义的宏__DATE__,显示编译源文件的日期。 日期以 "Mmm dd yyyy" 格式显示。 有什么方法可以使用宏来格式化这个日期吗? 采用这种格式 "yyyy Mmm dd"。 而不
当我运行以下代码时,qdatetime无效: QString dateString = QString(__DATE__).simplified(); QDateTime date = QDateT
我最近将我的编译器更改为 xc16 gcc 编译器。这个新编译器没有定义预处理器宏 __TIME__。 我所做的所有研究都让我解释了如何使用 __TIME__ 并且它是标准所要求的,但没有说明它是如何
为了显示构建日期,我使用了这些代码: NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; NSDateF
我需要自动将特定格式的编译日期放入一个 Java 源文件中,就像 C 编译器 DATE 定义的那样,如何实现? 最佳答案 标准 Java 编译器无法做到这一点(我认为 C 编译器也不会这样做 - 我猜
我正在尝试将 __DATE__ 宏生成的字符串转换为 time_t。我不需要成熟的日期/时间解析器,只处理 __DATE__ 宏格式的东西会很棒。 预处理器方法会很漂亮,但函数也同样有效。如果相关,我
在其中一个模块中使用了 __FILE__ 和 __DATE__ 宏的项目中,我试图在构建期间将这些宏的值重新定义为显式值.尝试使用 -D 选项,例如 -D__TIME__=01:23:45 给了我一个
我有以下结构(在嵌入式系统上): struct Calib_Time_struct { uint16_t year; uint16_t month; uint16_
在头文件中使用 __DATE__ 或 __TIME__ 时,包含该头文件的预处理器结果可能会有所不同。 在什么情况下在头文件中使用 __DATE__ 或 __TIME__ 会违反单一定义规则? 作为后
我使用 __DATE__ 宏来获取编译时年份: const QString build_year = __DATE__ + 7; QtCreator 中的 Clang 代码模型会因使用 __DATE_
在 C# 中是否有等同于 __DATE__ 和 __TIME__ 的东西? 基本上我想做的是在 C# 应用程序中放置一些构建时间戳。 One possibility我在微软的网站上看到是这样做的: A
想使用 __ DATE __ 和 __ TIME __ 作为整数,以便在编译时为我的代码提供自动化版本。 #define STRINGIZER(arg) #arg #define STR_VA
//NSString *compileDate = [NSString stringWithFormat:@"%s", __DATE__]; NSString *compileDate = [NSSt
使用 QDateTime::fromstring() 解析 MSVC++ 预定义的 __DATE__(可能与 __TIME__ 结合)宏不返回任何内容(= 无效的 QDateTime 对象)。为什么?
我正在寻找一种方法将编译时日期和时间嵌入我的程序输出以进行调试。 最佳答案 不,没有。使用build script相反。 另见: Include git commit hash as string i
Python 中有等价的 __DATE__ 和 __TIME__ 吗? 最佳答案 Python 没有与 C 相同的编译过程,因此没有可使用的宏,但如果您想要一些快速而肮脏的东西,__file__ 全局
ANSI C 中 __DATE__ 和 __TIME__ 字符串的大小是否有标准定义? 这个问题背后的动机是: 我有两个应用程序在两个不同的 CPU 上运行。 在运行时,应用 #1 从应用 #2 接收
我是一名优秀的程序员,十分优秀!