如何将整数转换为最短的有效C99函数名字符串?

时间:2012-12-30 17:33:34

标签: c++

我正在实现一个代码生成器,为每个代码生成器生成特定代码 x = y + w + z或A = B * C + D或其他类型的线性代数表达式。 每个表达式都分配有唯一的unsigned long id,在某些时候我需要将此id包装为唯一的函数名。

我找到a similar question但无法将解决方案转换为我的问题,因为我还必须用C ++编写此代码,并且因为有效的url名称与有效的C99函数名称不同。我真的不知道从哪里开始!

编辑:我确实忘了提到一个函数可以分配多个64位ID,因此将ID转换为字符串并连接字符串可能会导致函数名称太大而无法由所有编译器处理

编辑2: 好吧,我可能不够精确。我正在生成OpenCL代码,该代的目的是删除临时代码并减少内核启动时间。出于某种原因,opencl基于C99,但是一些编译无法处理很长的内核名称(因为这样我有一些构建错误。) 考虑到所有可能性(scalartype,运算符,内联函数等等),ID的64位勉强够用,但我认为它还不够

vec0 = vec1+vec2 has for example ID 1912142123
vec1 = vec0-vec2 has for example ID 3312098234
vec2 = vec0*scal has for example ID 329084089

这三个操作可以放在同一个内核中。我想为生成的代码生成内核名称,对于某些编译器来说,_1912142123_3312098234_329084089可能太长了。

希望现在更清楚了

1 个答案:

答案 0 :(得分:2)

以下算法使用n个数字转换数字,其中n是有效字符数:

char *digs = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabzdefghijklmnopqrstuvwxyz_";
int n = strlen(digs);

long id = 1912142123;
char buffer[16];
int i = 0;
do
    buffer[i++] = digs[id%n];
while((id /= n)>0);
buffer[i] = 0;

digs字符串应包含所有有效字符。在此示例中,'1912142123'将转换为'gZEzm1'