小编Rob*_*Rob的帖子

隐藏内联命名空间标头中的私有常量

我在头文件中的命名空间中包含一些内联函数,目前无法将它们移动到cpp文件中.其中一些内联函数使用魔术常量,例如:

// Foo.h
namespace Foo
{
    const int BAR = 1234;

    inline void someFunc()
    {
        // Do something with BAR
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想让这些魔法常数变得私密 - 任何想法如何?我的第一个想法是使用匿名命名空间:

// Foo.h
namespace Foo
{
    namespace
    {
        // 'private' constants here
        const int BAR = 1234;
    }

    inline void someFunc()
    {
        // Do something with BAR
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,Foo::BAR并且可用于包含的任何cpp文件Foo.h?有没有办法在不创建实现cpp文件的情况下执行此操作?

c++ namespaces

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

使用qmake/Qt Creator链接调试/发布库

我正在使用Qt Creator并拥有一个依赖于C++静态库项目的Qt GUI项目.我想将GUI应用程序的发布版本与.lib的发布版本以及带有调试.lib的GUI应用程序的调试版本链接起来.我已经找到了如何通过在我的.pro文件中包含如下所示的行来向项目中添加其他库:

LIBS += -L./libfolder -lmylib.lib

但是我看不出如何使用不同的-L命令来发布和调试版本.

qmake是否有支持这样做?

c++ qt qmake

25
推荐指数
2
解决办法
2万
查看次数

SVN用户的推荐Mercurial存储库/文件夹结构

我正在试验Hg,以便远离SVN但是想要了解我应该如何构建我的Hg存储库.我来自SVN背景(这可能会影响我对这应该如何工作的看法!)我的存储库目前看起来像这样:

Project1
  trunk
  branches
    1.0
    1.1
Project2
  trunk
Run Code Online (Sandbox Code Playgroud)

这似乎是构建SVN存储库的"传统"方式.

我该如何用Hg重现这个?为了增加这一点,我喜欢'稳定','qa'和'dev'存储库/文件夹的想法,并且如果可能的话想介绍这个.

我是一名Hg初学者,所以欢迎任何帮助或建议.

svn mercurial

24
推荐指数
3
解决办法
6029
查看次数

在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251

我正在将基于ATL的静态库转换为DLL,并且在使用ATL CString类(在atlstr.h中找到)的任何导出类上收到以下警告:

警告C4251:'Foo :: str_':类'ATL :: CStringT'需要让dll接口被'Foo'类的客户端使用

我正确地声明Foo该类是通过导出的__declspec(dllexport).这是一个我可以放心忽视的警告,还是我做错了什么?DLL项目设置被设置为与ATL动态链接,但这似乎没有任何区别.

例如:

#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

// This class is exported from the DLLTest.dll
class DLLTEST_API Foo
{
public:
 Foo();
 CString str_; // WARNING C4251 HERE
};
Run Code Online (Sandbox Code Playgroud)

此DLL的所有客户端也将使用ATL.

c++ dll atl dllexport

21
推荐指数
3
解决办法
4万
查看次数

静态或动态链接CRT,MFC,ATL等

回到90年代,当我第一次开始使用MFC时,我曾经动态链接我的应用程序并发送了相关的MFC DLL.这引起了我一些问题(DLL地狱!)而我改为静态链接 - 不仅仅是为了MFC,而是为了CRT和ATL.除了更大的EXE文件之外,静态链接从来没有给我带来任何问题 - 那么其他人是否有任何缺点?有没有充分的理由重新访问动态链接?我的应用程序现在主要是STL/Boost FWIW.

c++ linker mfc

20
推荐指数
2
解决办法
1万
查看次数

在Boost测试框架中测试assert

我使用Boost Test框架对我的C++代码进行单元测试,并想知道是否可以测试函数是否会断言?是的,听起来有点奇怪,但请忍受我!我的许多函数在输入时检查输入参数,断言它们是否无效,并且测试它是有用的.例如:

void MyFunction(int param)
{
    assert(param > 0); // param cannot be less than 1
    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...
Run Code Online (Sandbox Code Playgroud)

你可以检查使用Boost测试抛出的异常,所以我想知道是否还有一些断言魔法......

c++ boost unit-testing assert boost-test

20
推荐指数
3
解决办法
9989
查看次数

#include标头保护格式?

我知道这对项目没有什么影响,但是,假设您使用#defined标头保护C++代码,您使用什么格式?例如假设一个标题foo.hpp:

#ifndef __FOO_HPP__
...

#ifndef INCLUDED_FOO_HPP
...

#ifndef SOME_OTHER_FORMAT
Run Code Online (Sandbox Code Playgroud)

我卖的是关于大写#defines的想法,但不能解决这些守卫的格式.

c++ header c-preprocessor

20
推荐指数
5
解决办法
9258
查看次数

C++中的64位枚举?

有没有办法在C++中使用64位枚举?虽然重构了一些代码,但我遇到了一堆#defines,它们作为枚举会更好,但是大于32位会导致编译器出错.

出于某种原因,我认为以下可能有效:

enum MY_ENUM : unsigned __int64  
{  
    LARGE_VALUE = 0x1000000000000000,  
};
Run Code Online (Sandbox Code Playgroud)

c++ 64-bit enums

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

CComVariant与_variant_t,CComBSTR与_bstr_t

我使用ATL(VS2008,所以ATL9 IIRC)来创建COM对象,并一直使用CComVariant类(定义atlcomcli.h)来管理VARIANT类型.但是,还有一个VARIANT名为的包装器_variant_t.是否有任何区别CComVariant,并_variant_t和我应该使用哪一个?

同样,有两个BSTR包装器 - CComBSTR_bstr_t.再说一次,我应该选择哪个?为什么?

c++ com atl

18
推荐指数
2
解决办法
7913
查看次数

Qt 4.x:如何实现拖放到桌面或文件夹中?

我用Qt 4.x编写了一个用C++编写的小文件传输应用程序...它登录到服务器,向用户显示服务器上可用的文件列表,并允许用户上传或下载文件.

这一切都很好; 您甚至可以从桌面(或从打开的文件夹)拖入文件,当您将文件图标放入server-files-list-view时,删除的文件将上传到服务器.

现在我也请求相反的操作...我的用户希望能够将文件从server-files-list-view拖到桌面上,或者拖到打开的文件夹窗口中,然后让它文件下载到该位置.

这似乎是一个合理的要求,但我不知道如何实现它.有没有办法让Qt应用程序找到与"drop event"发生位置相对应的目录,当图标被放到桌面上或打开文件夹窗口时?理想情况下,这将是一个基于Qt的平台中立机制,但如果不存在,那么MacOS/X和Windows(XP或更高版本)的平台特定机制就足够了.

有任何想法吗?

c++ directory desktop qt drag-and-drop

18
推荐指数
1
解决办法
6516
查看次数