小智 8
(这可能会晚3年,但它仍然显示在谷歌搜索的顶部附近,并且信息今天仍然有效,因为它是3年前).
首先,是的,你是正确的,使用C++/CLI你不使用.h文件EXCEPT用于本机C++类,结构等.
可能会想到的第一个问题是,如果我没有#include "someheader.h"
提交,我该如何引用我的课程?这有两个答案:1)对于项目外的课程; 2)对于您在项目中的课程.
1)在.VCPROJ(项目属性页中的公共属性/框架和参考)中添加对.DLL(或解决方案中的另一个项目)的引用.
2)#using otherclass.obj
在目标文件上添加一个正确的#using!
在你的项目中,假设每个类都有自己的源文件,当你想在另一个类中引用它时,我们使用的#using "a_compiled_file"
是.dll或.obj文件.
在Project Property Pages中,在C/C++/General下,您将看到:解析#using References,只需添加MACRO字符串$(IntDir)
.这解析为已编译源代码的中间目录.
编译器读取.obj文件中的元数据(就像.dll文件中的元数据一样),并将其用于所需的所有信息,没有.h头文件!
我们这样做是因为C++/CLI编译器是TOO STUPID,以便像C#编译器那样记住同一项目中的类.
注意:在使用时,您可能会遇到共享冲突$(IntDir)
,在这种情况下,预编译文件并将它们放在自己的目录中.编译器只需要元数据,所以除非你改变类结构(想想.h的东西),否则每次都不需要编译.
当类之间调用内一个C++/CLI的项目,你必须#include
.编译器第一次遇到交叉引用.
您应该在 C++/CLI项目之间进行#using
ref类,而不是-ing.你现在已经超越了编译器,并且托管引用已经接管了.#include
(这是关于该主题的一个很好的讨论:MSDN论坛)
我发现在跨越混合托管/本地世界的解决方案中有用的模式是"无实现"而不是无头.这对于将混合使用C++和纯托管语言的新解决方案最有意义,它使C++代码"感觉"更像其他托管代码.用.写.h文件
// MyClass.h header file
#pragma once
// full class implementation
Run Code Online (Sandbox Code Playgroud)
和.cpp文件一起使用
#include "MyClass.h"
// nothing else
Run Code Online (Sandbox Code Playgroud)
我认为.cpp是非常可选的,可以省略,但能够方便的是能够按Ctrl + F7"仅构建此文件".它是否存在会影响构建顺序.
我认为重新组织最近/clr
添加了交换机的现有C++项目是不合理的.