我正在开发一个使用libzip的项目.我在c ++ 14工作,我在libzip周围写了一个小包装,让我的生活更轻松.
我有一个std::ostream围绕自定义类继承的对象std::streambuf.此streambuf使用libzip函数写入存档中的文件.
一切都很好,直到我使用std::endl.当我这样做时,输出文件被我的所有文本阅读器读取为二进制文件(仅写入字符串).
我的文本阅读器检测到它的二进制文件,因为在我使用的地方std::endl有一个NUL字节,任何带有NUL字节的文件都被视为二进制文件.
所以我的问题是:这是正常的吗?我有办法使用std::endl吗?
我的代码(提取它可能不完全相同).
source.hpp
// my attributes
std::unique_ptr<zip_source_t, std::function<void(zip_source_t*)>> _source;
std::unique_ptr<std::ostream> _stream;
std::unique_ptr<_ZipBuffer> _buffer;
class _ZipBuffer : public std::streambuf {
private:
zip_source_t* _source;
std::streamsize xsputn(char const* s, std::streamsize n) override;
int overflow(int c) override;
public:
_ZipBuffer(zip_source_t* file);
};
Run Code Online (Sandbox Code Playgroud)
source.cpp
// create the streambuf and send it to the ostream
_buffer.reset(new _ZipBuffer(_source.get()));
_stream.reset(new std::ostream(_buffer.get()));
// the implementation of _ZipBuffer
Zip::Source::_ZipBuffer::_ZipBuffer(zip_source_t* source) {
_source = source;
} …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用了两个 OpenGL 上下文。
第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。
当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,我在我的 VBO 中得到无效数据(全零),除非我调用glFlush或glFinish在加载上下文上创建 VBO 之后。
我认为这是由于我的加载上下文没有任何缓冲区交换或任何告诉 GPU 开始在其命令队列上工作并且什么都不做的东西(这导致渲染上下文端的 VBO 为空)。
从我所见,这种刷新在 Windows 上不是必需的(用 Nvidia GPU 测试,即使没有刷新也能工作),但在 linux/macOS 上是必需的。
苹果文档上的这个页面说调用glFlush是必要的(https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html)
如果您的应用程序在多个上下文之间共享 OpenGL ES 对象(例如顶点缓冲区或纹理),您应该调用 glFlush 函数来同步对这些资源的访问。例如,您应该在一个上下文中加载顶点数据后调用 glFlush 函数,以确保其内容已准备好被另一个上下文检索。
但是调用glFinish还是glFlush必要的,或者是否有更简单/更轻松的命令可用于实现相同的结果?(这是必要的,glFlush还是glFinish?)
另外,是否有文档或参考文献讨论过这个问题?我找不到任何提及,并且在实现之间的工作方式似乎有所不同。
在 MSVC 上编译项目时出现奇怪的错误。
我正在使用 Microsoft Visual Studio 15 2017 并在 c++17(MSVC 版本 15.6.85.37198)中编译
代码在 Clang 和 G++ 上编译,但在 MSVC 上给我一个错误。
我设法将导致错误的代码减少到以下代码段:
#include <cstddef>
struct Point {
double x;
double y;
double z;
};
template<class... Ps>
void doSomething() {
offsetof(Point, x);
}
int main() {
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
main.cpp(10): fatal error C1903: unable to recover from previous error(s); stopping compilation [build\example.vcxproj]
Run Code Online (Sandbox Code Playgroud)
起初我有点困惑,因为这是唯一的错误,我花了很长时间才确定问题来自 offsetof。
问题来自offsetof在接受参数包的模板化函数中使用宏。
我认为这段代码没有做任何非法的事情或使用未定义的行为。那么,是我的问题还是编译器中的错误?
谢谢