编程语言
ant-one
一个懒惰的程序员
展开
-
sprintf的三个要点
width之误解当使用s格式化字符串时prec可以截取控制字符串的长度widthprec均可用代替在参数列表指定数值函数原型:int sprintf(const char *fmt, …),其中fmt格式为:%[width][.prec][type]width之误解 width为字符的最小长度,如果不够,默认以空格右补齐。很多人误以为是最大长度限制,写出内存写越界的bug。比如: c原创 2017-03-01 20:40:00 · 689 阅读 · 0 评论 -
c++编译器bug记录
本文档意在记录工作中使用c++编译器(vc++、g++、clang++等)遇到的编译问题,虽然最终迂回解决,但不知其所以然,遂记录文档以便后面有时间思其所以然。1. 禁用拷贝构造函数,非explicit单参构造函数,无法使用=显式初始化1. 编译环境$ gcc --versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)Copyright ...原创 2019-04-27 22:16:09 · 315 阅读 · 0 评论 -
std::unordered_map如何使用不同类型的Key
std::unordered_map是c++11引入的关联容器,其HashMap特性和std::map的区别且不讨论,我们先看它的find和count方法:iterator find( const Key& key );(1) iterator find( const Key& key, size_t hash );(1) (C++20 起)const_iterator fi...原创 2019-04-13 13:16:34 · 1416 阅读 · 0 评论 -
c++之option模式
引言我们经常在golang代码中看到这样一种惯用法:根据选项option或者配置config创建一个对象,而创建对象的工厂函数CreateXXX的输入参数不是一个大的选项结构体Options,而是Option的变长参数。举个例子:func main() { p := CreatePersion(WithID(123), WithName("tom")) log.Printl原创 2018-02-03 15:57:19 · 5369 阅读 · 0 评论 -
c++11之运行期获取tuple元素
代码先行// 运行期以索引获取tuple元素// 需支持C++11及以上标准的编译器,VS2017 15.5.x、CodeBlocks 16.01 gcc 7.2// 参考《深入应用C++11:代码优化与工程级应用》p148,祁宇,机械工业出版社,2015年05templatetypename Visit>void VisitTuple(size_t index, std::tuple原创 2018-01-22 14:10:57 · 1871 阅读 · 0 评论 -
谈一谈c++中的unevaluated operand
谈一谈c++中的unevaluated operand什么是unevaluated operand我们先看2段外文: In some contexts, unevaluated operands appear (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). An unevaluated operand is not evaluated. An unevaluated operan原创 2017-03-05 13:00:31 · 1022 阅读 · 0 评论 -
如何判断一个类型是否重载了输出操作符
需要编译器支持c++14,直接上代码。template<typename T, typename = void>struct IsOverloadOsOperator : std::false_type {};template<typename T>struct IsOverloadOsOperator <T, std::void_t<decltype( *(std::ostream *)nul原创 2017-03-01 20:45:23 · 652 阅读 · 0 评论 -
memcpy自定义对象带来的问题
引言c++11前没有右值引用,我们怎么将一个包含资源的临时对象和“将亡值”转移或者交换到自己的变量中呢?我以前的做法是bitwise swap,即将两个对象的内存按位交换。这种做法一直工作得很好,直到最近一段代码在Linux上运行很OK换到windows上就崩溃,我才开始思考这种做法的安全性。出事代码公司代码有个线程调度框架,接口像极了WIN32程序窗口回调函数,通过一个整形MSGID来投递...原创 2019-04-29 08:38:08 · 602 阅读 · 0 评论