【发布时间】:2022-01-08 12:16:24
【问题描述】:
我正在尝试在C++ 程序中打印ffmpeg 版本。我看到在/libavutil/version.h 中有AV_VERSION 应该以x.x.x 的格式告诉版本号。
作为测试,我使用了一些随机数作为函数参数,如下所示:std::string version = AV_VERSION(3,4,2);。如果我使用文件中的LIBAVUTIL_VERSION_MAJOR、LIBAVUTIL_VERSION_MINOR 和LIBAVUTIL_VERSION_MICRO,也会出现同样的错误。这实际上是我第一次尝试打印版本号。
如果我尝试打印std::cout << AV_VERSION(LIBAVUTIL_VERSION_MAJOR,LIBAVUTIL_VERSION_MINOR,LIBAVUTIL_VERSION_MICRO) << std::endl;,我得到的错误是invalid suffix '.2' on floating constant 或invalid suffix '.101' on floating constant
我知道预处理器认为令牌是float,因此出现错误。您实际如何使用这种类型的宏功能?
那个宏在我上面提到的文件里,所以它一定是调用那个宏函数不报错的方法,认为是成熟的库,我猜其他库使用类似的东西打印版本号。
这是AV_VERSION在头文件中的定义以及我如何称呼它:
#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
#define AV_VERSION_MAJOR(a) ((a) >> 16)
#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8)
#define AV_VERSION_MICRO(a) ((a) & 0xFF)
#define LIBAVUTIL_VERSION_MAJOR 57
#define LIBAVUTIL_VERSION_MINOR 9
#define LIBAVUTIL_VERSION_MICRO 101
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
LIBAVUTIL_VERSION_MICRO)
#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
LIBAVUTIL_VERSION_MICRO)
int main()
{
std::string version = AV_VERSION(3,4,2);
std::cout << AV_VERSION(LIBAVUTIL_VERSION_MAJOR,LIBAVUTIL_VERSION_MINOR,LIBAVUTIL_VERSION_MICRO) << std::endl;
return 0;
}
我可以跳过这个错误,但是当我正在尝试学习 C++ 时,我很确定我会找到更多这种类型的宏,所以当我面对它们时,没有必要避免现在学习它们。
提前致谢!
【问题讨论】:
标签: c++ ffmpeg macros c-preprocessor token-pasting-operator