小编Fir*_*ser的帖子

何时以及何时不在 C 中进行类型转换存在冲突?

我在此处此处阅读有关搜索和排序功能的 GLibC 参考资料 ,在其中一个代码示例中,使用了类型转换,而在另一个示例中则不是:

第一:

int
compare_doubles (const void *a, const void *b)
{
  const double *da = (const double *) a;
  const double *db = (const double *) b;

  return (*da > *db) - (*da < *db);
}
Run Code Online (Sandbox Code Playgroud)

第二个:

int
critter_cmp (const void *v1, const void *v2)
{
  const struct critter *c1 = v1;
  const struct critter *c2 = v2;

  return strcmp (c1->name, c2->name);
}
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,是否有任何原因,例如

const struct critter *c1 = (const struct critter *)v1; …
Run Code Online (Sandbox Code Playgroud)

c casting

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

x86 代码将输入读入局部变量?

我是 x86 汇编的新手,并且已经阅读了这篇讨论 NASM x86 中的使用的文章scanf。这很有启发性,但是大多数答案都resd在本节中使用了全局变量.bss。相反,我想scanf通过以下 C 程序进入局部变量:

  #include <stdio.h>
  int main(void) {
      int x;
      scanf("%d", &x);
      return x;
  }
 
Run Code Online (Sandbox Code Playgroud)

x86 代码:

  #include <stdio.h>
  int main(void) {
      int x;
      scanf("%d", &x);
      return x;
  }
 
Run Code Online (Sandbox Code Playgroud)

我遵循 CDECL 调用约定,并使用 C 32 位运行时以及 C 32 位标准库进行链接。

; demo.asm

global main
extern scanf

section .data
fmt: db "%d", 0x00

section .text
main:
    ; prologue
    push ebp
    mov ebp, esp

    ; body

        ; allocate int …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly scanf nasm

3
推荐指数
1
解决办法
131
查看次数

C:找出没有 gcc 警告的 typedef 的 % 格式说明符?

typedef在 C 中尝试使用'd 变量时遇到的问题之一是弄清楚实际的原始类型是什么,typedef以便%在尝试使用printf. 大多数时候我不得不参考gcc. 例如,使用时,stat系统调用,返回的结构有很多不同成员的typedef“d类型的喜欢dev_tino_tmode_t,等,我通常去猜测什么样的格式说明可能是然后编译器警告我,我更正:

stat_demo.c: In function ‘main’:
stat_demo.c:46:45: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__blksize_t’ {aka ‘long int’} [-Wformat=]
   46 |     printf("block size for file system IO: %d\n", s->st_blksize);
      |                                            ~^     ~~~~~~~~~~~~~
      |                                             |      |
      |                                             int    __blksize_t {aka long int}
      |                                            %ld
Run Code Online (Sandbox Code Playgroud)

这是大多数人在打印 typedef 时使用它们的方式吗?这难道不是因为你需要知道真正的原始生命typedef是什么吗?有没有更好的方法来完全抽象实际类型?

c typedef

2
推荐指数
1
解决办法
68
查看次数

在 C 中使用按位运算符将颜色与位域混合?

我正在阅读有关位域的维基百科条目,并了解如何使用二进制数来表示原色并使用按位 OR ( |) 运算符将它们组合起来。我想检查一种颜色是否包含在另一种颜色中。

#include <stdio.h>

// primary colors
#define RED 0b001
#define GREEN 0b010
#define BLUE 0b100

// mixed colors 
#define BLACK 0b000
#define YELLOW (RED | GREEN)
#define MAGENTA (RED | BLUE)
#define CYAN (BLUE | GREEN)
#define WHITE (RED | GREEN | BLUE)

int main(void) 
{
    int magenta = MAGENTA;
    int blue = BLUE;

#define in &  // check if a color A is contained in another color B:
    printf("%s\n", blue in magenta ? …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bitwise-operators bit-fields

2
推荐指数
1
解决办法
125
查看次数

C:使用“ld”分别编译和链接组件程序?

我正在尝试理解extern和联系。作为一个简单的演示,我编写了两个 C 文件:一个使用函数的主文件和另一个定义该函数的文件:

/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
    print_nos(10, 20);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
/* print_nos.c */
#include <stdio.h>
void print_nos(int lower, int higher) {
    int i;
    for (i = lower; i <= higher; i++)
        printf("%d ", i);
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

我有两个与此相关的问题:

1)

我知道我可以简单地同时将两个文件作为参数传递给 gcc:

gcc -o main main.c print_nos.c
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想使用显式进行链接ld,所以我这样做了:

/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
    print_nos(10, 20);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,当我尝试运行输出文件时,我收到上述警告:

$ ./main …
Run Code Online (Sandbox Code Playgroud)

c linker extern

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