小编Aja*_*jay的帖子

确定是否将相同的指针传递给宏

有一组宏,用于调试,记录,堆栈跟踪显示等.其中一个是:

#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)

c++ templates compiler-errors static-assert visual-c++

3
推荐指数
1
解决办法
130
查看次数

朋友裁判课?

我有一个托管类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。我不能/不会使用托管编译器来编译非托管类。

.net dll mixed-mode c++-cli friend

3
推荐指数
1
解决办法
4063
查看次数

如何获取Windows用户帐户的用户权限和权限

我需要能够检查所有这些用户权限和特权.

我曾尝试使用令牌来访问这些令牌,但这只能完成特权列表.我检查了这个库,也这一个,但我无法找到一个解决方案.唯一的方法是独立完成每个指定权限/特权的测试吗?或者我可能只是一无所知.

任何正确方向的帮助将不胜感激!

c++ windows privileges access-rights

3
推荐指数
1
解决办法
1500
查看次数

C++索引类成员

我有一个类向量

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条件的最佳解决方案?

c++

3
推荐指数
1
解决办法
1597
查看次数

创建一个msi软件包,在计算机上安装32位和64位资源

我需要创建一个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安装程序中,它们同时注册这两个文件.

这是可能的,如果是这样,最好的方法是什么?

windows-installer wix 32bit-64bit firebreath

3
推荐指数
1
解决办法
2856
查看次数

_T宏是否会影响std :: string构造函数?

我继承了一些需要保持多字节/ unicode兼容的旧代码.它目前使用_T()宏.我想知道是否std::string引入了s _T()仍然需要吗?

例如

std::string foo(_T("hello"));
Run Code Online (Sandbox Code Playgroud)

或者它现在是多余的?

c++ visual-c++

3
推荐指数
1
解决办法
250
查看次数

即使通过引用传递,也将调用基类方法而不是派生方法

我有3类:AB,和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)

我希望它能够执行 …

c++ polymorphism inheritance

3
推荐指数
1
解决办法
1635
查看次数

从函数返回时的右值引用行为

在以下代码中:

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)

当编译它给在功能上的错误WrapperOfGetObjreturn Wrapobj.错误是

'Myclass :: Myclass(const Myclass&)':尝试引用已删除的函数

这意味着它正在尝试调用deleted复制构造函数.据我所知Wrapobj是左值,当返回它的行为应该是相同objGetObj方法,即,调用移动构造函数在时return. 那么为什么要寻找复制构造函数呢?我在这里错过了什么?

c++ rvalue-reference c++11 c++14

3
推荐指数
1
解决办法
130
查看次数

如果基类构造函数不是constexpr,我可以创建派生类constexpr的构造函数吗?

我试图从"设计模式"编译一个例子,我面临以下问题:

我有一个基类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)

c++ constructor constexpr c++11 c++14

3
推荐指数
2
解决办法
259
查看次数

哪个 DLL 有 PathCchAppend?

我正在尝试有条件地使用(如果可用)该函数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++ dll winapi windows-shell visual-c++

3
推荐指数
1
解决办法
1208
查看次数