c ++在文本中定义计算

时间:2016-06-22 00:37:15

标签: c++ c-preprocessor static-assert

headerfile.h

#define NBIT 128
#define DATASIZE 34

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)


template <unsigned int POWER>
class xzcMutatorECB128
{

#define POWERLIMINT (NBIT * DATASIZE * 0.7)
#define MSG2 "xzcMutatorECB128<POWER>; error template parametr: POWER; maximum="STR(POWERLIMINT)"; [en]: Key exceeded the limit;"
    static_assert(!(POWER > POWERLIMINT), MSG2);

public:
  xzcMutatorECB128();
}

的main.cpp

#include "headerfile.h"
int main(int argc, char *argv[])
{
xzcMutatorECB128<3400> xzc128e;
}

结果:

错误:C2338:xzcMutatorECB128&lt; POWER&gt ;;错误模板参数:POWER;最大=(128 * 34 * 0.7); [en]:密钥超出限制;

怎么做:

错误:C2338:xzcMutatorECB128&lt; POWER&gt ;;错误模板参数:POWER;最大= 3046; [en]:密钥超出限制;

NBIT和DATASIZE将改变

2 个答案:

答案 0 :(得分:0)

这在标准C ++中是不可能的。

预处理程序指令,例如

[Jaguar/Panthera]

#define

字符串化运算符 - 它们在编译的预处理阶段执行。执行“#”字符串化运算符,并在预处理阶段将其参数替换为字符串化版本。

直到稍后的编译阶段才会进行编译和优化。当编译器查看生成的代码时,参数已经被字符串化。

答案 1 :(得分:0)

模板类xzcMutatorECB128的定义是错误的。如果要定义模板类,可能在编译时不知道它的数据类型。另一方面,班级中的数据或功能应该是公共的或私人的或受保护的。