我有一些用于 FlexLM 的继承代码,它将整数转换为需要在 32 位和 64 位机器上工作的指针。整数从参数的 argc 填充到程序中,使用 scanf 读取整数值。
我应该如何可靠地读取 argc 字符串以获得适合分配给指针的值,以便它可以在 32 位和 64 位机器上工作?
目前代码看起来像这样:
// FlexLM includes this:
typedef char * LM_A_VAL_TYPE; /* so that it will be big enough for */
/* any data type on any system */
// My main() includes this:
[...]
if (!strcmp(argv[i], "-maxlen")) {
int max = 0;
i++;
if (i >= argc) {
break;
}
sscanf(argv[i], "%d", &max);
if (!max) {
fprintf(stderr, "Error: -maxlen %s Invalid line length\n", argv[i]);
} else {
lc_set_attr(lm_job, LM_A_MAX_LICENSE_LEN, (LM_A_VAL_TYPE)max);
}
}
[...]
起初我以为我可以使用uintptr_t
,但我怎么scanf
知道相应的大小?也许我应该使用 将它作为指针值读取%p
,但是手册页让我怀疑它是否可靠地工作:
p Matches an implementation-defined set of sequences, which shall be the
same as the set of sequences that is produced by the %p conversion
specification of the corresponding fprintf() functions. The
application shall ensure that the corresponding argument is a pointer
to a pointer to void. The interpretation of the input item is
implementation-defined. If the input item is a value converted earlier
during the same program execution, the pointer that results shall
compare equal to that value; otherwise, the behavior of the %p
conversion specification is undefined.
我宁愿不使用#ifdef 根据指针大小制作两个单独的版本,因为这对我来说似乎是代码上的一个丑陋的疣。