Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何防止C或C++;使用CRT功能的程序?_C++_C_Crt - Fatal编程技术网

C++ 如何防止C或C++;使用CRT功能的程序?

C++ 如何防止C或C++;使用CRT功能的程序?,c++,c,crt,C++,C,Crt,在我的例子中,我有两层,即核心层和应用层。 应用层依赖于核心层 我希望只有核心层应该使用CRT功能 在应用层,如果使用任何CRT函数,则不应编译该函数 有没有办法做到这一点? 例如,不应该在应用层直接调用free/malloc 我认为有一种方法是#定义所有CRT函数时出错,这样应用层就不能使用直接的CRT调用(应用层包括核心层的头文件)。您不需要#定义CRT中的所有函数。定义一个在头中声明的func就足以导致编译失败 此外,查看CRT标头,其中大多数都依赖于此类构造: #ifndef "

在我的例子中,我有两层,即核心层和应用层。 应用层依赖于核心层

我希望只有核心层应该使用CRT功能

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

有没有办法做到这一点? 例如,不应该在应用层直接调用free/malloc

我认为有一种方法是#定义所有CRT函数时出错,这样应用层就不能使用直接的CRT调用(应用层包括核心层的头文件)。

您不需要#定义CRT中的所有函数。定义一个在头中声明的func就足以导致编译失败

此外,查看CRT标头,其中大多数都依赖于此类构造:

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

如果定义了这个唯一ID,则会有效地不包含标题,因此在尝试使用这个标头中声明的函数时会发生编译错误。

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

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


对于静态库,请转到
library->General
并执行同样的操作。

也许您应该告诉您的开发人员,他们应该如何仅使用核心层接口分配内存,而不是发明阻碍他们工作的障碍。代码复查和大棒。@dbasic您想阻止开发人员吗?你认为你的开发人员懒惰无能。我认为您的组织在管理风格上比在编码风格上有更大的问题:-)如果您与整个团队沟通和讨论此类设计决策,他们很可能会接受并遵守这些规则。@dbasic在这种情况下,问题不在于CRT函数,而在于您公开的API(还有静态链接的CRT,为什么?)。如果您需要它,请将所有内容隐藏在您的库中,让他们使用任何他们想要的东西。@dbasic:基本上,您希望避免DLL地狱和与之相关的所有内容,以及任何对CRT的依赖。我们希望生活中没有很多东西,但限制标准库的使用,因为您担心这会非常糟糕dea。好主意!要求代码在不同的项目中,但这里可能就是这种情况,如果不是这样的话,beThis将破坏
/GS
选项,该选项会向代码中添加缓冲区检查调用。缓冲区检查的实现在CRT中。调用全局CTOR的代码也有类似的问题;这也是从CRT代码。我不知道。所以,如果你删除对CRT的所有引用,代码将被编译,但那些运行时检查将不会被执行?全局构造函数会发生什么?如果不能调用它们,代码甚至不应该编译。在我看来,这类设计非常糟糕。这些事情应该由编译器实现,而不是CRT。@dario_ramos:如果省略CRT,添加的指令将导致链接错误(因为它们只是未解析的函数调用)。可以调用全局构造函数;编译器毕竟将它们放在了.obj文件中。但是您决定忽略调用者,编译器怎么能预见到这一点?请注意,编译器无法实现它,因为这些操作是在链接器范围内有效完成的。这是有意义的。因此,我对问题的回答是可行的,但它会强制执行操作要禁用/GS缓冲区检查,他还必须以某种方式手动调用全局构造函数,或者根本不使用全局构造函数。对吗?