有一组宏,用于调试,记录,堆栈跟踪显示等.其中一个是:
#define ASSERT_IF_NULL_2(_ptr1, _ptr2) \
ASSERT(_ptr1); \
ASSERT(_ptr2);
Run Code Online (Sandbox Code Playgroud)
这是我编写的宏的简化版本.如果断言(运行时)失败,我有自定义断言对话框,将这种空检查失败记录到日志文件中.还编写了宏,以便在编译时检查非指针(static-assert).
现在,我正在寻找一些静态断言来检查两个指针是否实际相同.例:
int* ptr;
ASSERT_IF_NULL_2(ptr, ptr);
Run Code Online (Sandbox Code Playgroud)
应该引发编译器错误,因为宏的两个参数都是相同的.我不关心指针指向相同的内存(因为那是运行时).
我尝试过表达式:
int xx;
xx = 1 / (ptr-ptr);
xx = 1 / (&ptr - &ptr);
Run Code Online (Sandbox Code Playgroud)
它们都没有给出被零除编译器错误.另外,我尝试使用void*模板参数:
template<void* T>
class Sample{};
Run Code Online (Sandbox Code Playgroud)
但是它不允许将局部变量指针传递给模板非类型参数.
我使用的是VC9,它不支持constexpr关键字(甚至VS2012 也不支持).我尝试使用'const'代替,它不会抛出错误.我还将表达式用作数组大小,这总是会导致错误.
int array[(&ptr - &ptr)]; // Even with ptrdiff_t
Run Code Online (Sandbox Code Playgroud) 我有一个托管类Parser和一个非托管类CParser。前者是从DLL面向托管客户端(C#世界)公开的。核心功能在非托管类中CParser。由于两者都在同一个DLL中,并且存在一对一关系,因此托管类可以访问非托管类。
问题是我想Parser访问的所有成员CParser。我不想public:让所有成员都使用,也不愿意有二传手。因此,我只放置了friend关键字:
class CParser
{
...
friend ref class Parser; // C2144
};
// public ref class Parser{};
Run Code Online (Sandbox Code Playgroud)
我收到错误消息C2144,可能是由于非托管C ++无法理解ref关键字的明显原因。如果删除ref关键字,则托管编译器(compiling Parser)将抱怨并出现错误C2872:Ambigious Symbol。
还众所周知,internal:它不适用于未管理的C ++。
如何结交Parser的朋友CParser?
编辑:这个问题已经在这里,但是可能非托管类是在下编译的/clr。我不能/不会使用托管编译器来编译非托管类。
我有一个类向量
class vector3f
{
public:
float x;
float y;
float z;
};
Run Code Online (Sandbox Code Playgroud)
如果我想访问其中一个成员,我必须键入vec.x,vec.y和vec.z. 现在,我有一个应该按索引访问数据成员的算法,例如:
for(int i = 0; i < 3; i++)
{
vec[i] = i*i;
}
Run Code Online (Sandbox Code Playgroud)
没有索引这样做会导致几个if条件:
for(int i = 0; i < 3; i++)
{
if(i == 0){vec.x = i*i;}
else if(i == 1){vec.y = i*i;}
else if(i == 2){vec.z = i*i;}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法索引数据成员,以便在编译时解决它们?我不想在vector类中使用数组,因为使用vec.x,vec.y和vec.z访问数据成员对程序员来说更方便.什么是避免这些if条件的最佳解决方案?
我需要创建一个MSI包,它可以在一台机器上安装基于firebreath的插件的32位和64位.dll文件.
我想要实现的是安装两个资源并根据浏览器使用适合的资源(32位或64位).例如,如果我有64位的Windows机器,Chrome 64位和Firefox 32位机器; 我希望能够从两个浏览器中使用我的插件.
为此,我使用的是Visual Studio 2008和Wix.到目前为止,我能够创建一个32位.dll,它被转换为32位.msi和64位.dll,由于heat.exe而无法转换为64位.msi错误.我得到类似的内容:https://groups.google.com/forum/#!msg/firebreath-dev/HMGYEgZamUQ/35WJWfB4zegJ
之前提到的实现将创建2个不同的.msi安装程序(如果64位msi没有失败).我想要做的是生成两个.dll文件(32位.dll和64位.dll),然后将它们打包在一个单独的.msi安装程序中,它们同时注册这两个文件.
这是可能的,如果是这样,最好的方法是什么?
我继承了一些需要保持多字节/ unicode兼容的旧代码.它目前使用_T()宏.我想知道是否std::string引入了s _T()仍然需要吗?
例如
std::string foo(_T("hello"));
Run Code Online (Sandbox Code Playgroud)
或者它现在是多余的?
我有3类:A,B,和AnotherClass。其中B来源于A:
class A {
public:
A(){}
virtual void method() {//default action}
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个派生类B:
class B : public A {
public:
B(){}
void method() {//redefine action}
};
Run Code Online (Sandbox Code Playgroud)
和AnotherClass:
class AnotherClass {
public:
AnotherClass(A& a);
A a;
anotherMethod(){ a.method()}
};
AnotherClass :: AnotherClass(A& a) : a(a) //initialization
Run Code Online (Sandbox Code Playgroud)
因此,如果我AnotherClass用的对象构造一个对象B:
B b();
AnotherClass myObj(b);
Run Code Online (Sandbox Code Playgroud)
请记住,由于B继承自A,并AnotherClass接受的对象A,因此我能够成功传入一个B对象作为参数。
我打电话给:
myObj.anotherMethod();
Run Code Online (Sandbox Code Playgroud)
我希望它能够执行 …
在以下代码中:
class Myclass
{
public:
Myclass() = default;
~Myclass() = default;
Myclass(Myclass&&) = default;
Myclass& operator=(Myclass&&) = default;
Myclass(const Myclass&) = delete;
Myclass& operator=(const Myclass&) = delete;
};
Myclass GetObj()
{
Myclass obj;
return obj;
}
Myclass WrapperOfGetObj()
{
Myclass&& Wrapobj = GetObj();
return Wrapobj;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当编译它给在功能上的错误WrapperOfGetObj上return Wrapobj.错误是
'Myclass :: Myclass(const Myclass&)':尝试引用已删除的函数
这意味着它正在尝试调用deleted复制构造函数.据我所知Wrapobj是左值,当返回它的行为应该是相同obj的GetObj方法,即,调用移动构造函数在时return.
那么为什么要寻找复制构造函数呢?我在这里错过了什么?
我试图从"设计模式"编译一个例子,我面临以下问题:
我有一个基类MapSite:
class MapSite{
public:
MapSite();
virtual ~MapSite();
virtual void Enter() = 0;
};
Run Code Online (Sandbox Code Playgroud)
和派生类房间:
class Room : public MapSite final{
private:
unsigned int room_number;
public:
Room(unsigned int rn) : room_number(rn) {};
virtual void Enter() override;
};
Run Code Online (Sandbox Code Playgroud)
从另一个类我想调用该函数
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return make_unique<Room(n)>();}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
error: temporary of non-literal type ‘Room’ in a constant expression
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return unique::make_unique<Room(n)>();}
Run Code Online (Sandbox Code Playgroud)
所以我认为问题可能是构造函数必须constexpr从另一个函数调用Room的构造函数,但是将构造函数设置为:
constexpr Room(unsigned int rn) : room_number(rn) {};
Run Code Online (Sandbox Code Playgroud)
会产生这个错误:
error: call to non-constexpr function ‘MapSite::MapSite()’ …Run Code Online (Sandbox Code Playgroud) 我正在尝试有条件地使用(如果可用)该函数PathCchAppend。我已经从 header 获得了函数签名pathcch.h。但是,当我尝试从 获取函数的地址时SHLWAPI.DLL,它失败了:
auto pca = GetProcAddress(GetModuleHandle(L"shlwapi.dll"), "PathCchAppend");
Run Code Online (Sandbox Code Playgroud)
使用 Depends,我看到这个 DLL 中不存在这个函数(我在 Windows 10 上)。不存在任何pathcch.dll,因此也无法加载它。
这个函数放在哪个DLL中?
编辑:感谢您的回答。在这里我找到了 DLL 的名称,如下面的答案中所述:
https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-81-api-sets
c++ ×8
visual-c++ ×3
c++11 ×2
c++14 ×2
dll ×2
.net ×1
32bit-64bit ×1
c++-cli ×1
constexpr ×1
constructor ×1
firebreath ×1
friend ×1
inheritance ×1
mixed-mode ×1
polymorphism ×1
privileges ×1
templates ×1
winapi ×1
windows ×1
wix ×1