我在此处和此处阅读有关搜索和排序功能的 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);
}
第二个:
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);
}
在第二个示例中,是否有任何原因,例如
const struct critter *c1 = (const struct critter *)v1; …我是 x86 汇编的新手,并且已经阅读了这篇讨论 NASM x86 中的使用的文章scanf。这很有启发性,但是大多数答案都resd在本节中使用了全局变量.bss。相反,我想scanf通过以下 C 程序进入局部变量:
  #include <stdio.h>
  int main(void) {
      int x;
      scanf("%d", &x);
      return x;
  }
 
x86 代码:
  #include <stdio.h>
  int main(void) {
      int x;
      scanf("%d", &x);
      return x;
  }
 
我遵循 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 …我typedef在 C 中尝试使用'd 变量时遇到的问题之一是弄清楚实际的原始类型是什么,typedef以便%在尝试使用printf. 大多数时候我不得不参考gcc. 例如,使用时,stat系统调用,返回的结构有很多不同成员的typedef“d类型的喜欢dev_t,ino_t,mode_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
这是大多数人在打印 typedef 时使用它们的方式吗?这难道不是因为你需要知道真正的原始生命typedef是什么吗?有没有更好的方法来完全抽象实际类型?
我正在阅读有关位域的维基百科条目,并了解如何使用二进制数来表示原色并使用按位 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 ? …我正在尝试理解extern和联系。作为一个简单的演示,我编写了两个 C 文件:一个使用函数的主文件和另一个定义该函数的文件:
/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
    print_nos(10, 20);
    return 0;
}
/* 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");
}
我有两个与此相关的问题:
我知道我可以简单地同时将两个文件作为参数传递给 gcc:
gcc -o main main.c print_nos.c
这工作正常,但我想使用显式进行链接ld,所以我这样做了:
/* main.c */
#include <stdio.h>
extern void print_nos(int, int);
int main(void) {
    print_nos(10, 20);
    return 0;
}
如您所见,当我尝试运行输出文件时,我收到上述警告:
$ ./main …