就我而言,我有两层,即核心层和应用层。应用层依赖于核心层。
我希望只有核心层应该使用 CRT 功能。
在应用层,如果使用了任何 CRT 函数,它不应该编译。
有什么办法可以做到这一点?例如,不应该在应用层直接调用free/malloc。
我认为#define所有CRT函数出现错误的一种方法是应用程序层不能使用直接CRT调用(应用程序层包括核心层的头文件)。
你不需要#define CRT 中的所有函数。定义头文件中声明的函数之一就足以导致编译失败。
此外,查看 CRT 标头,它们中的大多数都依赖于这种结构:
#ifndef "some unique id"
#define "some unique id"
/* header body */
#endif
如果你定义了这个唯一的id,你将有效地导致不包含头文件,因此在尝试使用在这个头文件中声明的函数时会发生编译错误。
假设您的所有项目都是本机 C 或 C++,我相信删除对 Windows CRT 二进制文件的引用就足够了。如果有人尝试使用它们,他们将收到链接错误。
对于 dll,打开项目属性(从 Visual Studio),然后转到Configuration Properties->Linker->Input
并设置Ignore All Default Libraries
为Yes (/NODEFAULTLIB)
. 在那个之上,设置Additional Dependencies
为您需要的解决方案中的库。
对于静态库,请转到Librarian->General
并执行相同操作。