Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C宏将SVN修订转换为整数_C++_C_Svn_Macros_C Preprocessor - Fatal编程技术网

C++ C宏将SVN修订转换为整数

C++ C宏将SVN修订转换为整数,c++,c,svn,macros,c-preprocessor,C++,C,Svn,Macros,C Preprocessor,我正在寻找一个C/C++宏,它可以将$revision:9$或$revision:999999$之类的随机SVN版本转换为整数或字符串 我知道有简单的函数可以实现这一点,但我希望在编译时实现这一点 我的愿望是写这样的东西:unsigned int rev=SVN_to_int$Revision$ 我相对确信,这在宏中是不可能的 使用模板元编程可能是可行的,但我从未接近过 也可以使用预构建脚本,用所需文本替换SVN_TO_INT 不过,我不明白您为什么要这样做,因为硬编码版本号同样容易,因为您在编

我正在寻找一个C/C++宏,它可以将$revision:9$或$revision:999999$之类的随机SVN版本转换为整数或字符串

我知道有简单的函数可以实现这一点,但我希望在编译时实现这一点


我的愿望是写这样的东西:unsigned int rev=SVN_to_int$Revision$

我相对确信,这在宏中是不可能的

使用模板元编程可能是可行的,但我从未接近过

也可以使用预构建脚本,用所需文本替换SVN_TO_INT


不过,我不明白您为什么要这样做,因为硬编码版本号同样容易,因为您在编译时就知道它。

我相对确定,这在宏中是不可能的

使用模板元编程可能是可行的,但我从未接近过

也可以使用预构建脚本,用所需文本替换SVN_TO_INT


不过,我不明白您为什么要这样做,因为硬编码版本号同样容易,因为您在编译时就知道它。

您不能在预处理或编译时完全使用字符串,但为什么不使用类似以下的东西呢

int svn_version() 
{
     static const int v = extract_svn_version(REVISION);
     return v;
}

您无法在预处理或编译时完全使用字符串,但为什么不使用以下内容:

int svn_version() 
{
     static const int v = extract_svn_version(REVISION);
     return v;
}

<>你不能用C预处理器宏或模板C++来编译你想要的字符串操作。您需要使用一个外部实用程序或脚本,可以从构建过程中调用它

一些实用程序/脚本/代码可能会帮助您:

SvnRev:
<>你不能用C预处理器宏或模板C++来编译你想要的字符串操作。您需要使用一个外部实用程序或脚本,可以从构建过程中调用它

一些实用程序/脚本/代码可能会帮助您:

SvnRev:
我同意不能在编译时通过宏或模板处理字符串。所以不要使用字符串

这是一个丑陋的黑客,但我认为它符合你的所有要求。我不推荐

#define $Revision struct REV_STR { unsigned foo
#define $ * 64; };

$Revision: 4521 $

enum { REV = sizeof(REV_STR) / 8 };

#undef $Revision
#undef $

#include <iostream>
int main()
{
   std::cout << REV << std::endl;
   return 0;
}

// $ g++ -Wall -Wextra revision.cpp && ./a.exe
// revision.cpp:4: warning: width of `REV_STR::foo' exceeds its type
// 4521

我同意不能在编译时通过宏或模板处理字符串。所以不要使用字符串

这是一个丑陋的黑客,但我认为它符合你的所有要求。我不推荐

#define $Revision struct REV_STR { unsigned foo
#define $ * 64; };

$Revision: 4521 $

enum { REV = sizeof(REV_STR) / 8 };

#undef $Revision
#undef $

#include <iostream>
int main()
{
   std::cout << REV << std::endl;
   return 0;
}

// $ g++ -Wall -Wextra revision.cpp && ./a.exe
// revision.cpp:4: warning: width of `REV_STR::foo' exceeds its type
// 4521

我同意宏是不可行的,但是,我发现了一个使用编译器优化的技巧。 结果是,表达式JL_SvnRetoint$Revision:12345$减少为一个无符号整数:12345

inline unsigned int JL_SvnRevToInt(const char *r) {


    if ( r == NULL || r[0] == '\0' || r[10] == '\0' || r[11] == '\0' || r[12] == '\0' || r[13] == '\0' )
    return 0;

    const unsigned int count = 
          r[11] == ' ' ? 1
        : r[12] == ' ' ? 10
        : r[13] == ' ' ? 100
        : r[14] == ' ' ? 1000
        : r[15] == ' ' ? 10000
        : r[16] == ' ' ? 100000
        : r[17] == ' ' ? 1000000
        : r[18] == ' ' ? 10000000
        : r[19] == ' ' ? 100000000
        : 0;

    return
        (r[11] == ' ' ? 0 : (r[11]-'0') * (count/10) +
        (r[12] == ' ' ? 0 : (r[12]-'0') * (count/100) + 
        (r[13] == ' ' ? 0 : (r[13]-'0') * (count/1000) + 
        (r[14] == ' ' ? 0 : (r[14]-'0') * (count/10000) + 
        (r[15] == ' ' ? 0 : (r[15]-'0') * (count/100000) +
        (r[16] == ' ' ? 0 : (r[16]-'0') * (count/1000000) +
        (r[17] == ' ' ? 0 : (r[17]-'0') * (count/10000000) +
        (r[18] == ' ' ? 0 : (r[18]-'0') * (count/100000000) +
        (r[19] == ' ' ? 0 : (r[19]-'0') * (count/1000000000) +
        0)))))))));
}

它支持9位数的修订号、NULL和空以及$revision$字符串。

我同意它不适用于宏,但是,我发现了一个使用编译器优化的技巧。 结果是,表达式JL_SvnRetoint$Revision:12345$减少为一个无符号整数:12345

inline unsigned int JL_SvnRevToInt(const char *r) {


    if ( r == NULL || r[0] == '\0' || r[10] == '\0' || r[11] == '\0' || r[12] == '\0' || r[13] == '\0' )
    return 0;

    const unsigned int count = 
          r[11] == ' ' ? 1
        : r[12] == ' ' ? 10
        : r[13] == ' ' ? 100
        : r[14] == ' ' ? 1000
        : r[15] == ' ' ? 10000
        : r[16] == ' ' ? 100000
        : r[17] == ' ' ? 1000000
        : r[18] == ' ' ? 10000000
        : r[19] == ' ' ? 100000000
        : 0;

    return
        (r[11] == ' ' ? 0 : (r[11]-'0') * (count/10) +
        (r[12] == ' ' ? 0 : (r[12]-'0') * (count/100) + 
        (r[13] == ' ' ? 0 : (r[13]-'0') * (count/1000) + 
        (r[14] == ' ' ? 0 : (r[14]-'0') * (count/10000) + 
        (r[15] == ' ' ? 0 : (r[15]-'0') * (count/100000) +
        (r[16] == ' ' ? 0 : (r[16]-'0') * (count/1000000) +
        (r[17] == ' ' ? 0 : (r[17]-'0') * (count/10000000) +
        (r[18] == ' ' ? 0 : (r[18]-'0') * (count/100000000) +
        (r[19] == ' ' ? 0 : (r[19]-'0') * (count/1000000000) +
        0)))))))));
}
它支持9位修订号、NULL和空以及$revision$字符串。

如果您有一个基于makefile的生成系统,您可以制定一个特殊规则,在每次maketime创建一个文件

如果您有一个基于makefile的构建系统,那么您可以制定一个特殊规则,在每次maketime创建一个文件

我的解决办法是

#define $Revision (false?1
#define $ +0)

int codeRevision() { return $Revision: $; }

#undef $Revision
#undef $
我的解决办法是

#define $Revision (false?1
#define $ +0)

int codeRevision() { return $Revision: $; }

#undef $Revision
#undef $

编译器的好处在于,如果只使用编译时常量,它们实际上可以用结果值替换函数调用。当我想比较几种交换价值的方法时,VC曾经这样对我;使用/O2生成的汇编代码不再包含任何函数调用;只有常量。如果您想在可执行文件中自动嵌入修订号,我认为您走错了路,因为通过svn关键字嵌入的修订号只有在提交修改后的文件时才会更改。因此,您无法确定带有SVN_TO_INT宏的文件是否始终反映您的项目修订。但是,我同意您的意见,每个文件的版本系统适合我使用每个文件一个类,每个类一个版本编译器的优点是,如果只使用编译时常量,它们实际上可以用结果值替换函数调用。当我想比较几种交换价值的方法时,VC曾经这样对我;使用/O2生成的汇编代码不再包含任何函数调用;只有常量。如果您想在可执行文件中自动嵌入修订号,我认为您走错了路,因为通过svn关键字嵌入的修订号只有在提交修改后的文件时才会更改。因此,您无法确定带有SVN_TO_INT宏的文件是否始终反映您的项目修订。但是,我同意您的意见,每个文件系统的修订版适合我使用每个文件一个类,每个类一个修订版是的,但是每次更改它都很痛苦:实际上,你可以编写一个脚本,它将在makefile中运行,然后放置一个-DSVN\u RE
VISION=89278进入命令行。+1表示基本上为什么在编译之前可以这样做,我一直在想这个问题。是的,但每次更改它都很痛苦:实际上,您可以编写一个脚本,该脚本将在makefile中运行,并将-DSVN_REVISION=89278放入命令行。+1表示基本上为什么可以这样做在编译之前,我一直在思考这个问题。我想避免将修订字符串存储在我的二进制文件$revision:XXXX$中,然后您必须在源代码之外执行它,并在构建环境中定义它-即使在C++0x中,之前似乎有编译时字符串处理,但我猜仍然没有不能保证字符串文字将从二进制文件中删除-编译器可能会也可能不会这样做。为什么不希望它出现在二进制文件中?我们在CVS中使用它是为了在二进制文件上找到构建信息。一旦二进制文件进入客户,我们就无法控制它们的去向,有时,了解某个客户系统正在运行的版本是非常有用的。我希望避免将修订字符串存储在二进制文件$revision:XXXX$中,然后您必须在源代码之外执行此操作,并在构建环境中定义它-即使在C++0x中,在此之前似乎有编译时字符串处理没有,我想这仍然不能保证字符串文字将从二进制文件中删除-编译器可能会也可能不会这样做。为什么不希望它出现在二进制文件中?我们在CVS中使用它是为了在二进制文件上找到构建信息。一旦二进制文件传到客户那里,我们就无法控制它们的去向,有时知道某个客户系统运行的是哪个版本是非常有用的。这太恶心了,我向你致敬!尊敬我喜欢!尽管我会建议任何人不要写这样的东西。那太恶心了,我为此向你致敬!尊敬我喜欢!尽管我建议任何人都不要写这样的东西。