我有一个巨大的Visual Studio 2010解决方案.我使用Visual Studio 2005,所以我想将解决方案转换为所需的版本.基本上,它是一个可移植的C++代码,所以它也应该在Visual Studio 2005上编译.更改*.sln文件中的版本没有帮助,因为*.vcxproj格式与旧的*.vcproj格式完全不同.
由于其尺寸,手动重新创建解决方案不是一种选择.还有一些我不知道的非默认编译器标志,依赖项等(我无法查看所有这些我不理解的XML垃圾).
关于如何将C++ Visual Studio 2008项目降级到2005年已经存在相关问题.但是,该实用程序建议最多支持Visual Studio 2008.
有什么建议?
我的问题如下:Martin York在此声称,这个,并且这个答案可以stringstream通过使用basic_stringbuf::pubsetbuf这样的方式从一些内存中读取:
char buffer[] = "123";
istringstream in;
in.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); // calls basic_stringbuf::setbuf
int num;
in >> num; // reads 123
Run Code Online (Sandbox Code Playgroud)
不幸的是,我挖掘了整个标准,无法确定它在哪里工作.我看到的只是实现定义.实际上在微软的实现上(也许在其他人的实现上),这个调用没有任何效果.
以下是我在上一篇C++ 0x草案中找到的相关引文.对于basic_streambuf::setbuf[streambuf.virt.buffer]:
1 效果:以本条款(27.8.1.4,27.9.1.5)中从basic_streambuf派生的每个类别单独定义的方式影响流缓冲.
2 默认行为: 什么都不做.返回此.
但是在派生类中,它似乎保留了行为实现定义.因为basic_stringbuf::setbuf它说[stringbuf.virtuals]:
1 效果: 实现定义,但setbuf(0,0)无效.
因为basic_filebuf::setbuf它说[filebuf.virtuals]:
12 效果:如果setbuf(0,0)[...],则流变为无缓冲.否则结果是实现定义的."无缓冲"[...]
就是这样.所以我看到它,一个有效的实现可以完全忽略这些调用(对于非null参数).
我错了吗?这个标准的正确解释是什么?C++ 98/03/0x有相同的保证吗?您是否有更多关于上述代码的哪些实现以及不适用的实现的统计信息?如何basic_streambuf::setbuf使用?
请考虑以下代码,将相同的值写入多个线程的相同内存位置:
void f(int* buf, int n, int* p) {
for(int i = 0; i < n; i++)
buf[i] = i;
*p = buf[n/2];
}
void g(int* buf, int n) {
int x1, x2;
thread t1(f, buf, n, &x1);
thread t2(f, buf, n, &x2);
t1.join();
t2.join();
assert(x1 == x2);
}
Run Code Online (Sandbox Code Playgroud)
虽然它很有意思,但我不太关心标准给出的保证,因为我猜它没有给出.我真正关心的是上述代码在真实世界多处理器硬件上的行为.是否assert总是通过或有任何竞争条件,缓存同步问题等的机会.?
我想为OpenGL对象(纹理,帧缓冲区等)编写一个简单的RAII包装器.我注意到,所有glGen*和glDelete*函数共享相同的签名,所以我的第一次尝试是这样的:
typedef void (__stdcall *GLGenFunction)(GLsizei, GLuint *);
typedef void (__stdcall *GLDelFunction)(GLsizei, const GLuint *);
template <GLGenFunction glGenFunction, GLDelFunction glDelFunction>
class GLObject
{
GLuint m_name;
public:
GLObject()
{
glGenFunction(1, &m_name);
}
~GLObject()
{
glDelFunction(1, &m_name);
}
GLuint getName() {return m_name;}
};
typedef GLObject<glGenTextures, glDeleteTextures> GLTexture;
Run Code Online (Sandbox Code Playgroud)
它工作正常的纹理,但没有对帧缓冲器:glGenFramebuffers和glDeleteFramebuffers函数地址在编译时不知道,并不能作为模板参数.所以我做了第二个版本:
class GLObjectBase
{
GLuint m_name;
GLDelFunction m_delFunction;
public:
GLObjectBase(GLGenFunction genFunc, GLDelFunction delFunction)
: m_delFunction(delFunction)
{
genFunc(1, &m_name);
}
GLuint getName()
{
return m_name;
}
protected:
~GLObjectBase()
{ …Run Code Online (Sandbox Code Playgroud) 我知道标准允许std::vector<int, A>为不同的分配器使用相同类型的迭代器A.这称为SCARY迭代器.
现在问题是标准允许std::vector<int, A>::iterator只是一个typedef A::pointer,从而使它只是一个int*默认的分配器?
或者是否有一些(隐含的)要求它是每个容器的单独类类型?如果没有这样的要求那么为什么所有主要实现(包括SCARY)都不使用这种方法?它可能会进一步减少编译器工作,尽管现在代码重载int*并且vector<>::iterator不会编译.
来自N3290,[container.requirements.general]:
a.swap(b)对于除标准容器类型的容器a和b之外的表达式,array应交换a和b的值,而不对单个容器元素调用任何移动,复制或交换操作.
这如何与小字符串优化相互作用?他们忘了添加std::string吗?
我已经做了一些搜索,也阅读了SQLite网站上的常见问题解答,没有运气找到我的问题的答案.
很可能我的数据库方法存在缺陷,但目前,我想将我的数据存储在多个SQLite3数据库中,这意味着单独的文件.我非常担心由于我的应用程序可能崩溃导致的数据损坏,或者在我的表中更改数据时停电.
为了确保数据完整性,我基本上需要这样做:
在数据库#1中启动事务修改表#1修改数据库#2提交中的表,如果错误则回滚
这是否得到了SQLite的支持?另外,我使用的是sqlite.net,特别是基于SQLite 3.6.23.1的最新版本.
UPDATE
还有一个问题 - 这是人们通常会在单元测试中添加的内容吗?我总是单元测试数据库,但从来没有像这样的情况.如果是这样,你会怎么做?这几乎就像你必须将另一个参数传递给方法,如bool test_transaction,如果是真的,则在数据库访问之间抛出异常.然后在调用后进行测试,以确保第一组数据没有进入其他数据库.但也许这是可以被SQLite的测试覆盖了东西,应该不会出现在我的测试案例.
我有两个问题:
1)是否可以实现使用alloca在堆栈上分配内存的分配器,否则符合C++ STL?
如果那里有代码,只需将我指向URL即可让我高兴.:-)如果那里没有代码,也许你可以草拟函数allocate和deallocate?
2)如果对上述问题的回答为"是",我想了解如何为类成员在堆栈上分配内存.举个例子,考虑一下
std::vector<int, AllocaAllocator<int> >
Run Code Online (Sandbox Code Playgroud)
并且假设对该向量的成员函数'resize'的调用首先调用'deallocate'然后'分配'分配器.
调用allocate的范围是成员函数resize的范围.这是不是意味着在该函数调用结束时从堆栈中删除了已分配的内存?
亲切的问候,Bjoern
考虑给定的代码
struct ABC
{
ABC()
{
std::cout<<" Calling from default constructor";
}
ABC(const ABC ©)
{
std::cout<<"Calling from copy constructor";
}
};
int main()
{
ABC abc = ABC();
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题
Q1)从复制构造函数参数声明中删除const会产生错误.为什么?
Q2)添加const关键字后,我没有看到对复制构造函数的调用.为什么?复制构造函数没有被调用,为什么const是必要的?
TIA
在C中,该memmem函数用于定位存储区中的特定字节序列.它可以被同化strstr,专用于以null结尾的字符串.
是否有任何特殊原因使此函数可用作GNU扩展,而不是直接在标准库中?手册说明:
这个功能在Linux库中被破坏,包括libc 5.0.9; 在那里,针和干草堆参数被互换,并且返回了第一次出现针的末尾的指针.
旧的和新的libc都有错误,如果针是空的,则返回haystack-1(而不是haystack).并且glibc 2.0使情况变得更糟,返回指向haystack的最后一个字节的指针.这在glibc 2.1中得到修复.
我可以看到它经历了几次修复,但我想知道为什么它不像strstr某些发行版那样直接可用(如果不是更多).它是否仍然会带来实施问题?
编辑:动机.如果标准反过来决定它,我不会问这个问题:包括memmem但不是strstr.确实,strstr可能是这样的:
memmem(str, strlen(str), "search", 6);
Run Code Online (Sandbox Code Playgroud)
考虑到在C函数中通常需要数据块和它的长度,但是稍微复杂但仍然是一个非常合乎逻辑的单行.
编辑(2):评论和答案的另一个动机.引用Theolodis:
并非每个函数都是必需的,或者至少是大多数C开发人员,因此它实际上会使标准库变得不必要的巨大.
嗯,我完全同意,在使图书馆更轻,更快的时候,我总是在这里.但那么......为什么两者strncpy和memcpy(来自凯尔塔尔的评论)......?我几乎可以问:为什么穷人memmem被"黑色"?