相关疑难解决方法(0)

尽管使用相同的固定长度数据类型,C 程序在不同的机器上产生不同的结果

我在尝试 inttypes.h 时编写的简单程序:

#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>

bool get_bit(uint32_t x, uint8_t n) {
    x >>= n;
    return x & 1;
}

int main() {
    uint32_t x;
    uint8_t n;

    printf ("Enter x: ");
    scanf("%"SCNu32, &x);

    printf ("Enter n: ");
    scanf("%"SCNu8, &n);

    printf("The %"PRIu8"th bit of %"PRIu32" is: %d", n, x, get_bit(x, n));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的手机(64 位八核 ARN LTE Soc Android 10)上,它工作正常:

Enter x: 1
Enter n: 0
The 0th bit of 1 is: 1
Run Code Online (Sandbox Code Playgroud)

但在我的计算机(64 位 x86 Windows …

c windows mingw scanf c99

37
推荐指数
1
解决办法
2412
查看次数

用于size_t类型变量的跨平台格式字符串?

在跨平台的c/c ++项目(Win32,Linux,OSX)中,我需要使用*printf函数来打印一些size_t类型的变量.在某些环境中,size_t是8个字节,而在其他环境中它们是4.在glibc上我有%zd,在Win32上我可以使用%Id.有一种优雅的方式来处理这个问题吗?

c c++ printf cross-platform size-t

32
推荐指数
5
解决办法
2万
查看次数

便携式标记指针

是否有一种可移植的方法来在 C/C++ 中实现标记指针,例如一些跨平台和编译器工作的记录宏?或者,当您标记指针时,您自己会面临危险吗?如果存在这样的辅助函数/宏,它们是任何标准的一部分还是仅作为开源库提供?

对于那些不知道标记指针是什么但感兴趣的人来说,这是一种在普通指针中存储一些额外数据的方法,因为在大多数体系结构上,指针中的某些位始终为 0 或 1,因此您可以保留标志/类型/ 提示这些额外的位,并在您想要使用指针取消引用某些实际值之前擦除它们。

const int gc_flag = 1;
const int flag_mask = 7; // aka 0b00000000000111, because on some theoretical CPU under some arbitrary OS compiled with some random compiler and using some particular malloc last three bits are always zero in pointers.

struct value {
   void *data;
};

struct value val;
val.data = &data | gc_flag;
int data = *(int*)(val.data & flag_mask);
Run Code Online (Sandbox Code Playgroud)

https://en.wikipedia.org/wiki/Pointer_tagging

c c++ pointers

8
推荐指数
1
解决办法
4593
查看次数

如何解决“格式中未知的转换类型字符‘z’”编译器特定的警告?

我正在处理交叉编译到多个目标架构的代码。

我看着少数 点击来自搜索堆栈溢出的的“printf的size_t未知的转换型性格”的警告,但这些职位似乎都涉及到minGW,所以这些问题的答案,基本上是ifdef荷兰国际集团对抗_WIN32,并不适用于我的基本上是相同的实例问题,即printf不识别“ %zu”作为 的格式说明符size_t,但使用mips交叉编译器。

是否有一个现有的编译器标志(针对上述交叉编译器)使 libc 能够将“%zu”识别为 的格式说明符size_t

$ cat ./main.c
// main.c

#include <stdio.h>

int main( int argc, char* argv[] )
{
  size_t i = 42;
  printf( "%zu\n", i );
  return 0;
}

$ /path/to/mips_fp_le-gcc --version
2.95.3
$ 
$ file /path/to/libc.so.6
/path/to/libc.so.6: ELF 32-bit LSB pie executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.2.15, not …
Run Code Online (Sandbox Code Playgroud)

c printf mips cross-compiling format-specifiers

6
推荐指数
1
解决办法
1539
查看次数

printf("%f",x) ok, printf("%F",x) 错误格式参数太多

当我在 CodeBlocks 中使用说明符 F 时,为什么编译器给我错误“格式参数太多”?

#include <stdio.h>

int main()
{
    float x = 3.14159;
    printf("%f\n", x);
    printf("%F\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

#include <stdio.h>

int main()
{
    float x = 3.14159;
    printf("%f\n", x);
    printf("%F\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c printf codeblocks format-specifiers

6
推荐指数
1
解决办法
253
查看次数

printf 和 size_t 使用 FFI

为了size_t在 C 中用打印整数printf,转换格式器是%zu

但是,当我使用printfwith 时%zu,通过 FFI 打印zu而不是整数调用 Haskell 中的 C 函数。如何解决?

最小的例子

文件zu.c

#include <stdio.h>

void printzu(){
    size_t x = 666;
    printf("x=%zu", x);
}
Run Code Online (Sandbox Code Playgroud)

模块库.hs

{-# LANGUAGE ForeignFunctionInterface #-}
module Lib
  where
import Foreign

foreign import ccall unsafe "printzu" printzu' :: IO ()
Run Code Online (Sandbox Code Playgroud)

测试

Prelude> import Lib
Prelude Lib> printzu'
x=zu
Run Code Online (Sandbox Code Playgroud)

c haskell ffi

4
推荐指数
1
解决办法
166
查看次数