c - 你最喜欢的 C 编程技巧是什么?

标签 c

<分区>

例如,我最近在 linux 内核中遇到了这个:

/* Force a compilation error if condition is true */
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

因此,在您的代码中,如果您的结构必须是 8 字节的倍数,可能由于某些硬件限制,您可以这样做:

BUILD_BUG_ON((sizeof(struct mystruct) % 8) != 0);

除非 struct mystruct 的大小是 8 的倍数,否则它不会编译,如果它是 8 的倍数,则根本不会生成运行时代码。

我知道的另一个技巧来自“Graphics Gems”一书,它允许单个头文件在一个模块中同时声明和初始化变量,而在使用该模块的其他模块中,只需将它们声明为外部变量。

#ifdef DEFINE_MYHEADER_GLOBALS
#define GLOBAL
#define INIT(x, y) (x) = (y)
#else
#define GLOBAL extern
#define INIT(x, y)
#endif

GLOBAL int INIT(x, 0);
GLOBAL int somefunc(int a, int b);

这样,定义 x 和 somefunc 的代码就可以:

#define DEFINE_MYHEADER_GLOBALS
#include "the_above_header_file.h"

虽然仅使用 x 和 somefunc() 的代码会:

#include "the_above_header_file.h"

因此您会得到一个头文件,该文件在需要的地方声明了全局变量和函数原型(prototype)的实例,以及相应的外部声明。

那么,您最喜欢的 C 编程技巧是什么?

最佳答案

C99 使用匿名数组提供了一些非常酷的东西:

删除无意义的变量

{
    int yes=1;
    setsockopt(yourSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
}

成为

setsockopt(yourSocket, SOL_SOCKET, SO_REUSEADDR, (int[]){1}, sizeof(int));

传递可变数量的参数

void func(type* values) {
    while(*values) {
        x = *values++;
        /* do whatever with x */
    }
}

func((type[]){val1,val2,val3,val4,0});

静态链表

int main() {
    struct llist { int a; struct llist* next;};
    #define cons(x,y) (struct llist[]){{x,y}}
    struct llist *list=cons(1, cons(2, cons(3, cons(4, NULL))));
    struct llist *p = list;
    while(p != 0) {
        printf("%d\n", p->a);
        p = p->next;
    }
}

我敢肯定还有很多我没有想到的其他很酷的技术。

关于c - 你最喜欢的 C 编程技巧是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/599365/

相关文章:

c - 如何将 long double 与 qsort 以及 NaN 进行比较?

c++ - 如何正确比较两个无符号字符?

C: MPI_Allgather 产生错误

c - memcpy--memcpy 后内核崩溃

c++ - 从 B 树中删除一个节点

c - 将结构添加到 C 中的数组

c - C 中数组的动态分配

c - 使用 fread() 读取结构体

c - scanf() 函数中的扫描集有什么区别?

c - 轮询 uBlox MAX-6Q