C的隐藏功能

我知道所有C编译器实现背后都有一个标准,所以不应该有隐藏的特性。 尽管如此,我确信所有C开发人员都有他们始终使用的隐藏/秘密技巧。


函数指针。 您可以使用一个函数指针表来实现例如快速间接线程代码解释器(FORTH)或字节码调度器,或模拟类OO虚拟方法。

然后在标准库中存在隐藏的宝石,例如qsort(),bsearch(),strpbrk(),strcspn()[后两者对于实现strtok()替换有用)。

C的错误特征是带符号的算术溢出是未定义的行为(UB)。 因此,无论何时您看到像x + y这样的表达式都是有符号整数的,它可能会溢出并导致UB。


更多GCC编译器的技巧,但你可以给编译器提供分支指示提示(在Linux内核中很常见)

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

请参阅:http://kerneltrap.org/node/4705

我喜欢的是它也增加了一些功能的表现力。

void foo(int arg)
{
     if (unlikely(arg == 0)) {
           do_this();
           return;
     }
     do_that();
     ...
}

int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t

这些是标准中的可选项目,但它必须是隐藏功能,因为人们不断重新定义它们。 我曾经工作过的一个代码库(现在仍然是这样)具有多重定义,所有代码都有不同的标识符。 大部分时间都是预处理器宏:

#define INT16 short
#define INT32  long

等等。 这让我想把我的头发拉出来。 只需使用freaking的标准整数typedefs!

链接地址: http://www.djcxy.com/p/73575.html

上一篇: Hidden features of C

下一篇: What is the correct way to initialize a very large struct?