从 C++ 移植到 C++/CLI
Porting from C++ to C++/CLI
我真的不相信这个问题以前从未被问过,但我确实尝试过搜索但没有成功,如果您对已经回答过的类似问题有 link,请分享。
我正在将 C++/Win32 程序移植到 C++/CLI,当然,我正在尝试尽可能减少对代码的修改次数,以加快重新测试阶段的速度。
由于全局函数将对象作为参数,我遇到了一些麻烦,这里有一个简短的例子:
Class头文件
namespace MyNamespace {
public ref class MyClass {
public:
void test();
};
}
Class cpp 文件
using MyNamespace;
void myFunction(MyClass ^obj);
void MyClass::test() {
myFunction(this);
}
问题来了:如果我从 MyNamspace 中省略 myFunction,它就不能使用 MyClass 作为参数类型。如果我在 MyNamespace 中包含 myFunction,每个 cpp 文件都会正确编译,但我会得到一个 linker 错误 "LNK2028 unresolved token".
一个想法是定义一个新的 class 并将 myFunction 包含为一个 public 静态方法,但这样做将是一项漫长的工作,因为 myFunction 在实际项目中不是一个人...还有其他想法吗?
如果 MyClass
在 MyNamespace
而 myFunction
不在,您可以使用 MyClass
全名限定:
void myFunction(MyNamespace::MyClass ^obj);
当然你的myFunction
应该在某处实施。
我按照 Nikita 的建议进行了一些测试,最终的工作代码如下所示:
Class头文件
namespace MyNamespace {
public ref class MyClass {
public:
void test();
};
}
Class cpp 文件
void myFunction(MyClass ^obj);
using MyNamespace;
void MyClass::test() {
myFunction(this);
}
全局函数cpp文件
using namespace MyNamespace;
void myFunction(MyClass ^obj) {
//do something
}
在全局函数的 cpp 文件中使用此方法可以使用 MyClass 而 myFunction 保持(或假装保持)全局,并且 MyClass::test 可以访问 myFunction 即使不在同一个命名空间中, 仅使用 "old" c++.
中的原型声明
我真的不相信这个问题以前从未被问过,但我确实尝试过搜索但没有成功,如果您对已经回答过的类似问题有 link,请分享。
我正在将 C++/Win32 程序移植到 C++/CLI,当然,我正在尝试尽可能减少对代码的修改次数,以加快重新测试阶段的速度。
由于全局函数将对象作为参数,我遇到了一些麻烦,这里有一个简短的例子:
Class头文件
namespace MyNamespace {
public ref class MyClass {
public:
void test();
};
}
Class cpp 文件
using MyNamespace;
void myFunction(MyClass ^obj);
void MyClass::test() {
myFunction(this);
}
问题来了:如果我从 MyNamspace 中省略 myFunction,它就不能使用 MyClass 作为参数类型。如果我在 MyNamespace 中包含 myFunction,每个 cpp 文件都会正确编译,但我会得到一个 linker 错误 "LNK2028 unresolved token".
一个想法是定义一个新的 class 并将 myFunction 包含为一个 public 静态方法,但这样做将是一项漫长的工作,因为 myFunction 在实际项目中不是一个人...还有其他想法吗?
如果 MyClass
在 MyNamespace
而 myFunction
不在,您可以使用 MyClass
全名限定:
void myFunction(MyNamespace::MyClass ^obj);
当然你的myFunction
应该在某处实施。
我按照 Nikita 的建议进行了一些测试,最终的工作代码如下所示:
Class头文件
namespace MyNamespace {
public ref class MyClass {
public:
void test();
};
}
Class cpp 文件
void myFunction(MyClass ^obj);
using MyNamespace;
void MyClass::test() {
myFunction(this);
}
全局函数cpp文件
using namespace MyNamespace;
void myFunction(MyClass ^obj) {
//do something
}
在全局函数的 cpp 文件中使用此方法可以使用 MyClass 而 myFunction 保持(或假装保持)全局,并且 MyClass::test 可以访问 myFunction 即使不在同一个命名空间中, 仅使用 "old" c++.
中的原型声明