interpositioning(有些人称它为“interposing”)就是通过编写与库函数同名的函数来取代该库函数的行为。它可以使库函数在特定的程序中被同名的用户函数所取代,通常是用于调试或为了提高效率。

使用interpositioning需要格外小心。很容易发生自己代码中某个符号的定义取代函数库中的相同符号的意外。不仅你自己所进行的所有对该库函数的调用将被自己版本的函数调用所取代,而且所有调用该函数库的系统调用也将用你的函数取而代之(在你的代码中的对该函数的系统调用部分)。一个例子:嵌入式开发中,printf重定向到串口:在自己的代码段使用interpositioning重写实现printf函数的底层fputc()函数。fputc()函数原本是将字符ch打印到文件指针stream所指向的文件流去的,重定向到串口不需要打印到文件流,而是打印到串口。使用interpositioning方法重写fputc()函数后,在自己的程序里调用printf()函数时,一样会使用自己版本的fputc()函数取代原来的fputc()函数。

当编译器注意到库函数被另外一个定义覆盖时,它通常不会给出错误信息。这也是遵循C语言的设计哲学,即程序员所做的都是对的。在这里,编译器也认为这是程序员的意图。interpositioning本身并不是BUG,它是编译器明确要求支持的。如果要避免interpositioning产生BUG,一个准则就是:不要让程序中的任何符号成为全局的,除非有意把它们作为程序的接口之一。

C语言所有的关键字都是保留的:

auto extern short while break
float signed _Alignas case for
sizeof _Alignof char goto static
_Atomic const if struct _Bool
continue inline switch _Complex default
int typedef _Generic do long
union _Imaginary double register unsigned
_Noreturn else restrict void _Static_assert
enum return volatile _Thread_local -

下表所列出的标识符不应该出现在自己程序的声明中。它们中的有些是始终保留的,其他一些则只有在包含一个特定的头文件后才是保留的。它们中的有些只在全局范围内才是保留的,其他一些规则无论在全局范围还是在文件范围内都予以保留。避免麻烦最容易的方法就是认为这些标识符始终属于系统所有,不把它们用作自己的标识符。