我在头文件中的命名空间中包含一些内联函数,目前无法将它们移动到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文件的情况下执行此操作?
我正在使用Qt Creator并拥有一个依赖于C++静态库项目的Qt GUI项目.我想将GUI应用程序的发布版本与.lib的发布版本以及带有调试.lib的GUI应用程序的调试版本链接起来.我已经找到了如何通过在我的.pro文件中包含如下所示的行来向项目中添加其他库:
LIBS += -L./libfolder -lmylib.lib
但是我看不出如何使用不同的-L
命令来发布和调试版本.
qmake是否有支持这样做?
我正在试验Hg,以便远离SVN但是想要了解我应该如何构建我的Hg存储库.我来自SVN背景(这可能会影响我对这应该如何工作的看法!)我的存储库目前看起来像这样:
Project1
trunk
branches
1.0
1.1
Project2
trunk
Run Code Online (Sandbox Code Playgroud)
这似乎是构建SVN存储库的"传统"方式.
我该如何用Hg重现这个?为了增加这一点,我喜欢'稳定','qa'和'dev'存储库/文件夹的想法,并且如果可能的话想介绍这个.
我是一名Hg初学者,所以欢迎任何帮助或建议.
我正在将基于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.
回到90年代,当我第一次开始使用MFC时,我曾经动态链接我的应用程序并发送了相关的MFC DLL.这引起了我一些问题(DLL地狱!)而我改为静态链接 - 不仅仅是为了MFC,而是为了CRT和ATL.除了更大的EXE文件之外,静态链接从来没有给我带来任何问题 - 那么其他人是否有任何缺点?有没有充分的理由重新访问动态链接?我的应用程序现在主要是STL/Boost FWIW.
我使用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测试抛出的异常,所以我想知道是否还有一些断言魔法......
我知道这对项目没有什么影响,但是,假设您使用#defined标头保护C++代码,您使用什么格式?例如假设一个标题foo.hpp
:
#ifndef __FOO_HPP__
...
#ifndef INCLUDED_FOO_HPP
...
#ifndef SOME_OTHER_FORMAT
Run Code Online (Sandbox Code Playgroud)
我卖的是关于大写#defines的想法,但不能解决这些守卫的格式.
有没有办法在C++中使用64位枚举?虽然重构了一些代码,但我遇到了一堆#defines,它们作为枚举会更好,但是大于32位会导致编译器出错.
出于某种原因,我认为以下可能有效:
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
Run Code Online (Sandbox Code Playgroud) 我使用ATL(VS2008,所以ATL9 IIRC)来创建COM对象,并一直使用CComVariant
类(定义atlcomcli.h
)来管理VARIANT
类型.但是,还有一个VARIANT
名为的包装器_variant_t
.是否有任何区别CComVariant
,并_variant_t
和我应该使用哪一个?
同样,有两个BSTR
包装器 - CComBSTR
和_bstr_t
.再说一次,我应该选择哪个?为什么?
我用Qt 4.x编写了一个用C++编写的小文件传输应用程序...它登录到服务器,向用户显示服务器上可用的文件列表,并允许用户上传或下载文件.
这一切都很好; 您甚至可以从桌面(或从打开的文件夹)拖入文件,当您将文件图标放入server-files-list-view时,删除的文件将上传到服务器.
现在我也请求相反的操作...我的用户希望能够将文件从server-files-list-view拖到桌面上,或者拖到打开的文件夹窗口中,然后让它文件下载到该位置.
这似乎是一个合理的要求,但我不知道如何实现它.有没有办法让Qt应用程序找到与"drop event"发生位置相对应的目录,当图标被放到桌面上或打开文件夹窗口时?理想情况下,这将是一个基于Qt的平台中立机制,但如果不存在,那么MacOS/X和Windows(XP或更高版本)的平台特定机制就足够了.
有任何想法吗?