标签 C/C++ 下的文章

#include <codecvt>
#include <locale>

namespace std
{
    class codecvt_chs : public std::codecvt_byname<wchar_t, char, std::mbstate_t>
    {
    public:
        explicit codecvt_chs() : codecvt_byname("chs") 
    };
}

static bool U2W(const std::string& source, std::wstring& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::wstring*>(std::addressof(static_cast<const std::wstring&>(std::wstring(std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool W2U(const std::wstring& source, std::string& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::string*>(std::addressof(static_cast<const std::string&>(std::string(std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool A2W(const std::string& source, std::wstring& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::wstring*>(std::addressof(static_cast<const std::wstring&>(std::wstring(std::wstring_convert<std::codecvt_chs>().from_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }
    return false;
}

static bool W2A(const std::wstring& source, std::string& buffer)
{
    try
    {
        buffer.swap(*const_cast<std::string*>(std::addressof(static_cast<const std::string&>(std::string(std::wstring_convert<std::codecvt_chs>().to_bytes(source))))));
        return true;
    }
    catch (const std::range_error& ex)
    {
        printf("%s", ex.what());
    }

    return false;
}

static bool U2A(const std::string& source, std::string& buffer)
{
    std::wstring temp;
    {
        if (U2W(source, temp) && W2A(temp, buffer))
        {
            return true;
        }
    }

    return false;
}

static bool A2U(const std::string& source, std::string& buffer)
{
    std::wstring temp;
    {
        if (A2W(source, temp) && W2U(temp, buffer))
        {
            return true;
        }
    }
    return false;
}

1.使用 cmake 生成 mysql 项目.
2.删除无关项目,仅留下以下列表项目文件(这11个项目文件编译出来的就是mysqlclient)
3.自行玻璃原有的第三方依赖库
4.添加项目并引用
5.8.0类似方法,自行去精简你的MySQL源代码吧。

说说抽取项目文件优点:
1.支持源码级调试,f12 未调试时可随时跟踪源代码。
2.减少项目依赖,让所有被依赖项成立树关系,减少工程配置项,使用项目引用。
3.你想到的我想不到,反正在windows下这种引用MySQLClient的方式,笔者认为更好。
4.减少MySQL自身大小,让这种关系在整个项目中被编译器优化。

- 1. libmysql\vsprojects\libmysql\authentication_win\auth_win_client.vcxproj
- 2. libmysql\vsprojects\libmysql\clientlib.vcxproj
- 3. libmysql\vsprojects\extra\comp_err.vcxproj
- 4. libmysql\vsprojects\dbug\dbug.vcxproj
- 5. libmysql\vsprojects\libmysql\libmysql.vcxproj
- 6. libmysql\vsprojects\mysys\mysys.vcxproj
- 7. libmysql\vsprojects\mysys_ssl\mysys_ssl.vcxproj         -- 依赖 OpenSSL
- 8. libmysql\vsprojects\strings\strings.vcxproj
- 9. libmysql\vsprojects\vio\vio.vcxproj
- 10. libmysql\vsprojects\zlib\zlib.vcxproj                  -- 可替换
- 11. libmysql\vsprojects\extra\zlib_decompress.vcxproj      -- 可删除

关系顺序

MySQL -> OpenSSL -> Zlib
Curl -> OpenSSl -> Zlib
我的项目 -> OpenSSL -> Zlib

最终成为: 我的项目 -> MySQL -> CURL -> OpenSSL -> Zlib

以 nlohmann json 为例,如果你不想用多行代码释放内存,那么就用一行代码释放内存吧。

swap(*const_cast<json*>(std::addressof(static_cast<const json&>(std::move(json())))));

std::vector 例子

    std::vector<int> test;
    test.push_back(1);
    test.swap(*const_cast<std::vector<int>*>(std::addressof(static_cast<const std::vector<int>&>(std::move(std::vector<int>())))));

%H 24小时制 %I 12小时制

static std::string SerializeChronoDate(const char* format = "%Y-%m-%d %H:%M:%S") // format = %F %T
{
    char buffer[40] = {};
    {
        if (std::strftime(
            buffer, 
            std::size(buffer), 
            format, 
            std::localtime(std::addressof(static_cast<const std::time_t&>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()))))
        ))
        {
            return std::string(buffer, std::size(buffer));
        }
    }

    throw std::runtime_error("failed to get current date as string");
}