防止包含stdio.h(或其他标准头文件)

Hos*_*ork 10 c stdio

我使用的代码库历史上曾经有意地试图避免依赖于stdio.h爬行.它有自己的打印格式和机制,那些应该用来代替printf等.

但是有人经常会添加一个依赖项,必须引起注意并被删除.所以我试着为最简单的情况发出警报:

#if !defined(NDEBUG)
   void printf(float dont_link_with_stdio_h);
#endif
Run Code Online (Sandbox Code Playgroud)

gcc人员似乎一直在思考如何阻止容易出错,因为如果你这样做有一个有用的信息......无论你是否包括在内<stdio.h>.

内置函数'printf'的冲突类型

有一种方法可以关闭此警告(-fno-builtin).并且有各种各样的方法可以做一些事情,例如过滤掉你不想去的东西的符号转储......

但有没有一个简单的非警告(如果你没有包括stdio.h)的方式提醒某人他们已经引入了不需要的printf用法?

Cor*_*lks 5

您可以重新定义printf为一些令人讨厌的值,这将导致编译或链接错误.例如:

#define printf do_not_include_stdio_h
#include <stdio.h>

int main(void) {
    printf("Hello, world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生输出:

undefined reference to `do_not_include_stdio_h'

如果您希望它是一个更加模糊的名称,或者如果您担心某些可怜的灵魂已定义,则可以包含无效符号do_not_include_stdio_h.

您可以在编译器标志中设置宏定义,这样就不必手动编辑文件.例如:

gcc -Dprintf=do_not_include_stdio_h my_file.c
Run Code Online (Sandbox Code Playgroud)