我有一个2D数组A
和一个指向其中某处的指针ptr
。我知道如何计算行号,但表达式的实际类型似乎是不可移植的:
#include <stdio.h>
int main(void) {
int A[100][100];
int *ptr = &A[42][24];
printf("row number is %d\n", (ptr - A[0]) / (sizeof(A[0]) / sizeof(A[0][0])));
printf("col number is %d\n", (ptr - A[0]) % (sizeof(A[0]) / sizeof(A[0][0])));
return 0;
}
在OS / X上,clang
编译器以这种方式抱怨:
warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
在Linux上,gcc
发出了类似的警告,但在Windows上,我得到了不同的诊断:
warning: format specifies type 'int' but the argument has type 'unsigned long long' [-Wformat]
此表达式的实际类型是什么?
有没有办法将表达式传递给printf
而没有丑陋的演员?
答案 0 :(得分:0)
很难说,我认为,并没有严格的规则来定义一种对所有平台都一致的类型。这样的表达式没有标准的库typedef。
如果您正在使用C ++,请考虑使用auto来声明这样的类型,并使用std :: cout来打印这种类型的值:依赖编译器为&lt;&lt;来选择适当的重载。