如何防止 C 或 C++ 程序使用 CRT 函数?

3

在我的案例中,我有两个层次,核心层和应用层。应用层依赖于核心层。

我希望只有核心层使用CRT函数。

在应用层中,如果使用任何CRT函数,它不应该编译。

有没有办法实现这一点?例如,在应用层中不能直接调用 free/malloc 。

我想到的一种方法是将所有CRT函数 #define为某个错误,这样应用层就不能使用直接的CRT调用(应用层包括核心层的头文件)。


3
也许你应该与你的开发人员谈论如何只使用核心层接口来分配内存,而不是发明阻碍他们工作的障碍。 - hansmaad
2
代码审查,以及一根大棍。 - Rook
2
@dbasic 你想阻止你的开发人员吗?你认为你的开发人员懒惰和无能。我认为你的组织在管理风格上存在比编码风格更大的问题 :-) 如果你与整个团队一起沟通和讨论这些设计决策,他们很可能会接受并遵守这些规则。 - hansmaad
1
在这种情况下,问题不在于 CRT 函数,而在于你公开的 API(以及静态链接的 CRT,为什么?)接受了潜在危险的参数。你不能也不应该因为实现细节(静态库)而强制库的使用者做某些事情。如果你需要它,那就把所有东西都隐藏在库内,让他们使用任何他们想要的东西。 - Adriano Repetti
1
@dbasic:基本上,你想要避免 DLL 地狱以及与此相关的所有问题,还要避免对 CRT 的任何依赖。有很多东西我们希望不需要,但因为你的恐惧而限制使用标准库会是一个难以置信的糟糕想法。 - SChepurin
显示剩余10条评论
2个回答

1

你不需要在CRT中定义所有的函数。只需定义头文件中声明的一个函数即可导致编译失败。

此外,请查看CRT头文件,它们大多依赖于某种类似的结构:

    #ifndef "some unique id"
    #define "some unique id"
    /* header body */
    #endif

如果您定义了这个唯一标识符,您将有效地导致头文件不被包含,因此在尝试使用在该头文件中声明的函数时会出现编译错误。

1

假设您的所有项目都是本地C或C ++,我相信删除对Windows CRT二进制文件的引用就足够了。如果有人尝试使用它们,他们将会得到链接错误。

对于dll,打开项目属性(从Visual Studio),然后转到配置属性->链接器->输入,并将忽略所有默认库设置为是(/NODEFAULTLIB)。在上面的位置,将附加依赖项设置为您需要的解决方案中的库。

对于静态库,请转到库管理员->常规并执行相同操作。


好主意!需要将代码放在不同的项目中,但这可能是这里的情况,如果不是的话,应该这样做。 - SomeWittyUsername
1
这将破坏添加缓冲区检查调用到您的代码中的/GS选项。缓冲区检查的实现在CRT中。您在调用全局构造函数的代码中也会遇到类似的问题;这也是从CRT代码中完成的。 - MSalters
不知道啊。所以,如果你移除掉所有对CRT(C运行库)的引用,代码会编译通过,但是那些运行时检查就不会执行了?而且全局构造函数会怎样呢?如果它们不能被调用,代码甚至都不应该能编译通过。在我看来,这是非常糟糕的设计。这些事情应该由编译器来实现,而不是CRT。 - dario_ramos
@dario_ramos:如果省略CRT(因为它们只是未解决的函数调用),则添加的仪器将导致链接错误。全局构造函数可能会被调用;编译器毕竟将它们放在.obj文件中。但是您决定留下调用者,编译器怎么能预见到呢?请注意,编译器无法实现它,因为这些操作实际上是在链接器范围内完成的。 - MSalters
有道理。所以,我的回答对这个问题是可行的,但它会强制OP禁用/GS缓冲区检查,并且他还必须手动调用全局构造函数,或者根本不使用全局构造函数。是这样吗? - dario_ramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接