我正在研究C语言中的小解析器和“方程求解器”,这个过程的一部分就是对算术运算进行算术运算。 每个标记包含void *指向数值数据的指针,以及枚举,它定义数据的类型。算术运算void *指向数值数据
这是函数的示例,它通过添加两个其他标记来创建新标记。为了做到这一点,我需要
- 检查类型
- 投
- 做手术
- 创建结果新的令牌
一个
Token* _CreateTokenByAddition(Token* arg1, Token* arg2){
Token *tokenResult;
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_IntData)){
int* intResult = malloc(sizeof(int));
*intResult = *(int*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_IntData);
}else
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(int*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_IntData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
return tokenResult;
}
我有 - ,*,/几乎相同的功能。我可能需要创造更多。
问题是: 如何创建一个支持所有简单操作的通用函数,如+ - * /? 我不想把这个函数放在宏中,然后通过替换数学操作数来复制它4次。 无论如何我可以简化数据类型检查和从void指针转换?
任何方式,我可以让这个代码,更好?
假设:我没有任何非数值数据类型(如字符串)
感谢
酷,非常感谢这些答复,我看你的函数指针的意思。 我将考虑它并使用这些方法之一。谢谢
想要获得第一个答案优势吗? – rpetrich 2010-02-23 22:41:57