静态数组声明 具有简单的C++程序,如SO: #include <stdio.h> #include <limits.h> template <typename T> char BinVal(T SrcVal) { //short BitsCount = sizeof(T)*CHAR_BIT; short BitsCount = sizeof(T)*CHAR_BIT; short SeparatorCount = sizeof(T)*2-1; short SeparatorSize = CHAR_BIT/2+1; static char BinValStr[ BitsCount + SeparatorCount ] = {0}; printf("BitsCount: %d\n", BitsCount); printf("SeparatorCount: %d\n", SeparatorCount); printf("BinValStr size: %d\n", BitsCount + SeparatorCount); int i = 0; int j = 0; for ( i=BitsCount+SeparatorCount-1; i>=0; i-- ) { if( (j+1)%SeparatorSize == 0) { BinValStr[i] = ' '; } else { if( SrcVal&1 == 1 ) BinValStr[i] = '1'; else BinValStr[i] = '0'; SrcVal >>=1; } j++; } char y='o'; return y; //return BinValStr; //printf("\nStr: %s", BinValStr); } int main(){ short val = 0b0000'0100'0001'0110; //18 dec printf("\nStr: %c", BinVal(val) ); } #包括 #包括 模板 char BinVal(T SrcVal){ //short-bitscont=sizeof(T)*字符位; short-bitscont=sizeof(T)*字符位; 短分离器计数=sizeof(T)*2-1; 短分隔符大小=字符位/2+1; 静态字符BinValStr[BitScont+SeparatorCount]={0}; printf(“BitScont:%d\n”,BitScont); printf(“分隔计数:%d\n”,分隔计数); printf(“BinValStr大小:%d\n”,BitScont+SeparatorCount); int i=0; int j=0; 对于(i=BitScont+SeparatorCount-1;i>=0;i--){ 如果((j+1)%SeparatorSize==0){ BinValStr[i]=''; } 否则{ if(SrcVal&1==1) BinValStr[i]=“1”; 其他的 BinValStr[i]=“0”; SrcVal>>=1; } j++; } chary='o'; 返回y; //返回BinValStr; //printf(“\nStr:%s”,BinValStr); } int main(){ 短值=0b0000'0100'0001'0110;//12月18日 printf(“\nStr:%c”,BinVal(val)); }

静态数组声明 具有简单的C++程序,如SO: #include <stdio.h> #include <limits.h> template <typename T> char BinVal(T SrcVal) { //short BitsCount = sizeof(T)*CHAR_BIT; short BitsCount = sizeof(T)*CHAR_BIT; short SeparatorCount = sizeof(T)*2-1; short SeparatorSize = CHAR_BIT/2+1; static char BinValStr[ BitsCount + SeparatorCount ] = {0}; printf("BitsCount: %d\n", BitsCount); printf("SeparatorCount: %d\n", SeparatorCount); printf("BinValStr size: %d\n", BitsCount + SeparatorCount); int i = 0; int j = 0; for ( i=BitsCount+SeparatorCount-1; i>=0; i-- ) { if( (j+1)%SeparatorSize == 0) { BinValStr[i] = ' '; } else { if( SrcVal&1 == 1 ) BinValStr[i] = '1'; else BinValStr[i] = '0'; SrcVal >>=1; } j++; } char y='o'; return y; //return BinValStr; //printf("\nStr: %s", BinValStr); } int main(){ short val = 0b0000'0100'0001'0110; //18 dec printf("\nStr: %c", BinVal(val) ); } #包括 #包括 模板 char BinVal(T SrcVal){ //short-bitscont=sizeof(T)*字符位; short-bitscont=sizeof(T)*字符位; 短分离器计数=sizeof(T)*2-1; 短分隔符大小=字符位/2+1; 静态字符BinValStr[BitScont+SeparatorCount]={0}; printf(“BitScont:%d\n”,BitScont); printf(“分隔计数:%d\n”,分隔计数); printf(“BinValStr大小:%d\n”,BitScont+SeparatorCount); int i=0; int j=0; 对于(i=BitScont+SeparatorCount-1;i>=0;i--){ 如果((j+1)%SeparatorSize==0){ BinValStr[i]=''; } 否则{ if(SrcVal&1==1) BinValStr[i]=“1”; 其他的 BinValStr[i]=“0”; SrcVal>>=1; } j++; } chary='o'; 返回y; //返回BinValStr; //printf(“\nStr:%s”,BinValStr); } int main(){ 短值=0b0000'0100'0001'0110;//12月18日 printf(“\nStr:%c”,BinVal(val)); },c++,C++,我得到“BinValStr的存储大小不是常数”错误 当我将BinValStr变量设置为“正常”时,本地一切正常。为什么将变量设为静态会导致错误?您试图使用变量作为数组大小,但需要编译时值。ISO C++不允许动态分配数组(GNU扩展为可变长度数组是例外),因此数组大小的表达式应该是代码> CONTXPRP < /P> template <typename T> char BinVal(T SrcVal) { constexpr short BitsCount = sizeo

我得到“BinValStr的存储大小不是常数”错误

当我将BinValStr变量设置为“正常”时,本地一切正常。为什么将变量设为静态会导致错误?

您试图使用变量作为数组大小,但需要编译时值。ISO C++不允许动态分配数组(GNU扩展为可变长度数组是例外),因此数组大小的表达式应该是代码> CONTXPRP</代码> < /P>
template <typename T>
char BinVal(T SrcVal) { 
    constexpr short BitsCount = sizeof(T)*CHAR_BIT;
    constexpr short SeparatorCount = sizeof(T)*2-1;
    
    constexpr short SeparatorSize = CHAR_BIT/2+1;
    static char BinValStr[ BitsCount + SeparatorCount ] = {0};
模板
char BinVal(T SrcVal){
constexpr short bitscont=sizeof(T)*字符位;
constexpr短分离器计数=sizeof(T)*2-1;
constexpr short SeparatorSize=字符位/2+1;
静态字符BinValStr[BitScont+SeparatorCount]={0};

前C++ 11变体可以是<代码>静态const <代码>,也可以使用<代码>整合式常数>代码>或类似的构造。

您尝试使用Valayle作为数组大小,而需要编译时间值。,因此数组大小的表达式应为
constexpr

template <typename T>
char BinVal(T SrcVal) { 
    constexpr short BitsCount = sizeof(T)*CHAR_BIT;
    constexpr short SeparatorCount = sizeof(T)*2-1;
    
    constexpr short SeparatorSize = CHAR_BIT/2+1;
    static char BinValStr[ BitsCount + SeparatorCount ] = {0};
模板
char BinVal(T SrcVal){
constexpr short bitscont=sizeof(T)*字符位;
constexpr短分离器计数=sizeof(T)*2-1;
constexpr short SeparatorSize=字符位/2+1;
静态字符BinValStr[BitScont+SeparatorCount]={0};

C++11之前的变体可能只是
静态常量
,或者使用
积分常量
或类似的构造。

这不是对您问题的回答,“Swift-Friday Pie”已经涵盖了这一点。相反,我想指出一些其他代码中的一个小问题:

if(SrcVal&1==1)

虽然这样做有效,但它可能不会像您想象的那样工作。简而言之:
==
绑定比
&
更难(优先级更高)

这意味着上面的
如果
如下:

1==1
=>
true
SrcVal&true
=>
SrcVal&1
=>执行按位AND运算,返回1或0。然后该数字被解释为真值并给出所需结果。那么,为什么它工作时会出现问题呢?好吧,假设您希望再次进行相同的测试,但现在您正在寻找f
ScrVal
的第一位是0,所以您写:

if(SrcVal&1==0)

现在它根本不起作用,因为:
1==0
=>
false
ScrVal&false
=>
ScrVal&0
=>
0

如何修复?两个简单的选项:

  • 将按位和括在括号中:
    if((SrcVal&1)==1)
  • 省略比较:
    if(SrcVal&1)

    • 这并不是对您问题的回答,“Swift-Friday Pie”已经涵盖了这一点。相反,我想指出您的一些其他代码中的一个小问题:

      if(SrcVal&1==1)

      虽然这样做有效,但它可能不会像您想象的那样工作。简而言之:
      ==
      绑定比
      &
      更难(优先级更高)

      这意味着上面的
      如果
      如下:

      1==1
      =>
      true
      SrcVal&true
      =>
      SrcVal&1
      =>执行按位AND运算,返回1或0。然后该数字被解释为真值并给出所需结果。那么,为什么它工作时会出现问题呢?好吧,假设您希望再次进行相同的测试,但现在您正在寻找f
      ScrVal
      的第一位是0,所以您写:

      if(SrcVal&1==0)

      现在它根本不起作用,因为:
      1==0
      =>
      false
      ScrVal&false
      =>
      ScrVal&0
      =>
      0

      如何修复?两个简单的选项:

      • 将按位和括在括号中:
        if((SrcVal&1)==1)
      • 省略比较:
        if(SrcVal&1)

      请提供。你所显示的不是一个简单的C++程序。它不编译。抱歉,它不能被复制:@ const你在没有静态检查的情况下运行在O3模式。模板没有被检查。实例化。这里是完整的程序。请提供。你所显示的不是一个简单的C++程序。它不编译。对不起,我。无法复制:@Const您正在O3模式下运行它,没有进行静态检查..未检查模板\instancedOK这是完整的程序,如果允许(和支持),请使用@DevSolar,是的,当然。深入了解这些简单模板的实现也是一种很好的学习体验,
      std::array
      integral_constant
      本质上就是在内部执行类似的操作。而
      std::array
      可能比[]-数组,并不是说它还要求它的大小是编译时常量