我一直在阅读一些关于Unicode的文章,并意识到我仍然对这件事做些什么感到困惑.
作为Windows平台上的c ++程序员,给予我的学科与任何教师大致相同:始终使用Unicode字符集; 如果可能的话,将其模板化或使用TCHAR; 喜欢wchar_t,std :: wstring over char,std :: string.
#include <tchar.h>
#include <string>
typedef std::basic_string<TCHAR> tstring;
// ...
static const char* const s_hello = "??"; // bad
static const wchar_t* const s_wchar_hello = L"??" // better
static LPCTSTR s_tchar_hello = TEXT("??") // even better
static const tstring s_tstring_hello( TEXT("??") ); // best
Run Code Online (Sandbox Code Playgroud)
不知怎的,我搞砸了,我引导自己相信如果我说"某事",那就意味着它是ASCII格式的,如果我说L"某事"就是Unicode.然后我读到了这个:
类型wchar_t是一种不同的类型,其值可以表示支持的语言环境(22.3.1)中指定的最大扩展字符集的所有成员的不同代码.类型wchar_t应具有与其他整数类型之一相同的大小,符号和对齐要求(3.11),称为其基础类型.类型char16_t和char32_t分别表示与uint_least16_t和uint_least32_t相同的大小,符号和对齐的不同类型,称为基础类型.
所以呢?如果我的语言环境从代码页949开始,那么wchar_t的扩展是从949 + 2 ^(sizeof(wchar_t)*8)?它说话的方式听起来像'我不在乎你的c ++实现是使用UTF编码还是什么'.
至少,我可以理解一切都取决于应用程序所在的语言环境.因此我测试了:
#define TEST_OSTREAM_PRINT(x) \
std::cout << "----" << std::endl; \
std::cout << "cout : " << x << std::endl; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用包含其他静态库的静态库.
有两个项目:Engine,MyGame
'Engine'将生成Engine.lib
'MyGame'将在链接时使用Engine.lib.
以下是我从visual studio 2012获得的构建消息:
1>------ Rebuild All started: Project: Engine, Configuration: Debug Win32 ------
2>------ Rebuild All started: Project: MyGame, Configuration: Debug Win32 ------
1> Precompiled.cpp
2> Main.cpp
2>LINK : fatal error LNK1104: cannot open file 'D:\klee\Engine\Debug\Engine.lib'
1> RenderGame.cpp
1> RenderDebug.cpp
1> MsgHandler.cpp
1> Main.cpp
1> Log.cpp
1> Input.cpp
1> Interface.cpp
1> Helper.cpp
1> GameObject.cpp
1> Framework.cpp
1> Engine.cpp
1> Config.cpp
1> Component.cpp
1> Generating Code...
1> Guicon.cpp
1>glu32.lib(GLU32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in glew32.lib(glew32.dll); …Run Code Online (Sandbox Code Playgroud) 我开始想知道set/unordered_set/sorted vector之间的确切性能差异是什么.
因此,编写测试代码是为了比较它们的处理时间,以便我可以证明以下语句我相信: - 矢量是线性搜索中最好的 - 由于散列,Unordered_set最适合搜索
#include <string>
#include <set>
#include <unordered_set>
#include <vector>
#include <iostream>
#include <iomanip>
#include <algorithm>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
void PrintSep(const std::string& title = "")
{
unsigned half = (78 - title.size()) / 2;
std::cout << std::string(half, '-') << ' ' << title << ' ' << std::string(half, '-') << std::endl;
} // PrintSep
void PrintTable( const char** names, double* times, unsigned count, unsigned colspan = 20)
{
std::cout << std::setw(colspan) << "type" << …Run Code Online (Sandbox Code Playgroud) 我想知道为什么OpenGL会将指针指向资源ID,因为我正在做这样的事情:
#include "OglResource.h"
#include <iostream>
void WINAPI DeleteVertexArray( GLuint item )
{
glDeleteVertexArrays(1, &item);
}
OglResource MakeOglResource( GLenum type )
{
switch( type )
{
case GL_VERTEX_SHADER:
return OglResource(glCreateShader(GL_VERTEX_SHADER), (OglResource::ReleaseFunc)glDeleteShader, GL_VERTEX_SHADER);
break;
case GL_FRAGMENT_SHADER:
return OglResource(glCreateShader(GL_FRAGMENT_SHADER), (OglResource::ReleaseFunc)glDeleteShader, GL_FRAGMENT_SHADER);
break;
case GL_VERTEX_ARRAY:
{
GLuint out = OglResource::INVALID_OGL_RESOURCE_ID;
glGenVertexArrays(1, &out);
return OglResource(out, DeleteVertexArray, GL_VERTEX_ARRAY);
}
break;
}
return OglResource();
}
Run Code Online (Sandbox Code Playgroud)
如果传递给OpenGL的资源ID的地址确实很重要,这很危险,因为只要MakeOglResource函数返回,我传递给OpenGL(&out)的位置就无效.
我对此进行了测试,看起来并没有让应用程序崩溃,但我很担心.
下面是OglResource的实现:
#ifndef _HANDLE_H
#define _HANDLE_H
#include <memory>
#include <functional>
#define CALL_CONVENTION WINAPI
template <typename HANDLE_TYPE>
class Handle
{ …Run Code Online (Sandbox Code Playgroud)