相关疑难解决方法(0)

如何在mingw-w64 gcc 7.1中无需警告地打印size_t?

我在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 printf size-t

16
推荐指数
2
解决办法
3531
查看次数

这是一种在C中做标记指针的可移植方式吗?

我编写了这个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 *?(这很遗憾地输出编译器警告,但我猜你会得到带有"正常"标记指针的那些......)

c portability pointers language-lawyer

5
推荐指数
1
解决办法
353
查看次数

标签 统计

c ×2

language-lawyer ×1

pointers ×1

portability ×1

printf ×1

size-t ×1