我在nuwen.net上使用minGW的mingw-w64(x64)分支.这是来自7.1版本的gcc:
gcc --version
gcc (GCC) 7.1.0
Run Code Online (Sandbox Code Playgroud)
我正在编译这个程序:
#include <stdio.h>
int main(void)
{
size_t a = 100;
printf("a=%lu\n",a);
printf("a=%llu\n",a);
printf("a=%zu\n",a);
printf("a=%I64u\n",a);
}
Run Code Online (Sandbox Code Playgroud)
有警告和c11标准:
gcc -Wall -Wextra -Wpedantic -std=c11 test_size_t.c
Run Code Online (Sandbox Code Playgroud)
我收到这些警告:
test_size_t.c: In function 'main':
test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned int}' [-Wformat=]
printf("a=%lu\n",a);
~~^
%I64u
test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned …Run Code Online (Sandbox Code Playgroud) 我编写了这个C代码,我假设它提供了可移植的标记指针:
typedef struct {
char tag[2];
int data;
} tagged_int;
#define TAG(x,y) (&(x)->tag[(y)])
#define UNTAG(x) (&(x)[-*(x)])
int main(void) {
tagged_int myint = {{0,1}, 33};
tagged_int *myptr = &myint;
char *myint_tag_1 = TAG(myptr,1);
char *myint_tag_0 = TAG(myptr,0);
char tag_1 = *myint_tag_1;
char tag_0 = *myint_tag_0;
tagged_int *myint_1 = UNTAG(myint_tag_1);
tagged_int *myint_0 = UNTAG(myint_tag_0);
}
Run Code Online (Sandbox Code Playgroud)
但是,我很好奇它是否真的可携带.
虽然数组操作部分是可移植的,但是转换是char *可struct *移植的,假设char *指的是第一个字段/元素struct *?(这很遗憾地输出编译器警告,但我猜你会得到带有"正常"标记指针的那些......)