Linux 工程向 Windows 平台迁移的一些小小 tips

VS2013 C++11

Visual Studio 2013 没有做到对 C++11 所有的支持,其中存在的一个特性就是 In-class member initializer

例如我们的代码在某个类的构造函数中使用初始化列表,并用{}对其中一个类类型的成员初始化,这样的写法是符合 C++11 语法的,但是编译无法通过。另一个例子参见 SO 的问题:

In-class member initializer fails with VS 2013


using std::vector;
using std::string; struct Settings
{
vector<string> allowable = { "-t", "--type", "-v", "--verbosity" };
};

MS 知道这个问题并且在后面版本的 VS 中修复了,所以没有什么特别需求的话还是推荐用最新的工具。

min max

另一个令人讨厌的问问题是windows.h内带有奇怪的 macro defination:

min
max
near
far

前面两个很多人遇到过,后面两个嘛,做3D开发的朋友应该是要骂人的。处理方法其实很简单


#ifdef min
#undef min
#endif #ifdef max
#undef max
#endif

Math Constants

#define _USE_MATH_DEFINES // for C++
#include <cmath> #define _USE_MATH_DEFINES // for C
#include <math.h>

gettimeofday

关于这个函数,有两种解决方案,如果一开始就是写跨平台的代码,那么不如索性使用 C++11 的时间函数,这个是真正跨平台的(多线程也一样)。举例如下:

std::chrono::time_point<std::chrono::system_clock> start_time =
std::chrono::system_clock::now();
// Do ...
std::chrono::time_point<std::chrono::system_clock> end_time =
std::chrono::system_clock::now(); std::chrono::milliseconds time_diff =
std::chrono::duration_cast<std::chrono::milliseconds>(
end_time - start_time);

如果需要兼容旧的 Linux 的代码,那么不妨使用下面的这一份实现:

#ifdef _WIN32
/* FILETIME of Jan 1 1970 00:00:00. */
static const unsigned __int64 epoch = ((unsigned __int64)116444736000000000ULL); /*
* timezone information is stored outside the kernel so tzp isn't used anymore.
*
* Note: this function is not for Win32 high precision timing purpose. See
* elapsed_time().
*/
int
gettimeofday(struct timeval * tp, struct timezone * tzp)
{
FILETIME file_time;
SYSTEMTIME system_time;
ULARGE_INTEGER ularge; GetSystemTime(&system_time);
SystemTimeToFileTime(&system_time, &file_time);
ularge.LowPart = file_time.dwLowDateTime;
ularge.HighPart = file_time.dwHighDateTime; tp->tv_sec = (long)((ularge.QuadPart - epoch) / 10000000L);
tp->tv_usec = (long)(system_time.wMilliseconds * 1000); return 0;
}
#endif // !_WIN32

strsep

#ifdef _WIN32
#include <time.h> char* strsep(char** stringp, const char* delim)
{
char* start = *stringp;
char* p; p = (start != NULL) ? strpbrk(start, delim) : NULL; if (p == NULL)
{
*stringp = NULL;
}
else
{
*p = '\0';
*stringp = p + 1;
} return start;
} #endif // _WIN32

MultiThread Lib

需要保证所有的模块都是使用一样的多线程库,因为 Windows 下的工程是由 CMAKE 生成的,所以直接在 CMakeLists 里面设置好:

elseif(MSVC)
set(CMAKE_CXX_FLAGS ".......")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MT")

Linux 工程向 Windows 平台迁移的一些小小 tips的更多相关文章

  1. Linux下开发Windows平台运行的程序 - MinGW

    开源不乏神人,于是有了MinGW(Minimalist GNU for Windows),又称mingw32,是将GCC编译器和GNU Binutils一直到Win32平台下,包含一系列头文件.库和可 ...

  2. lower_case_table_names和数据库在Linux和windows平台之间的相互迁移问题

    MySQL关于 lower_case_table_names 的文档 https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivi ...

  3. 代码从windows下visual studio到andriod平台迁移的修改记录

    前言 前言也是迁言,从windows的visual studio 2012平台迁移到android平台上,需用修改挺多的代码和需用注意地方. 我们当然的平台当初就考虑了其他平台跨平台的应用问题,所以一 ...

  4. Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)

    参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Lin ...

  5. Windows C盘格式化或者同平台迁移oracle数据库

    我们知道如果是Linux 同平台迁移oracle数据库.只要是安全关闭了数据库,在新机器上创建用户组,配置了环境变量,将数据库安装目录拷贝到对应的目录就好用了. 一直在寻求Windows平台上这类的解 ...

  6. 在Linux和Windows平台上操作MemoryMappedFile(简称MMF)

    操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段..NET 4.0新增加了一个System.IO. MemoryMap ...

  7. linux/windows平台生成随机数的不同方法

    linux平台,使用rand.Seed() //rand_linux.go package main import ( "math/rand" "time" ) ...

  8. 国密SM3算法在linux和windows平台结果不一致问题

    什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...

  9. windows平台快速搭建Linux(CentOS)

    VMware简介 VMware Workstation(简称 “虚拟机”)是一款功能强大的桌面虚拟计算机软件,用户可在Windows平台通过VMware软件同时运行不同的操作系统.这对IT开发人员而言 ...

随机推荐

  1. Docker 踩坑记(failed to build: Get https://registry-1.docker.io/v2/microsoft/dotnet/manifests/2.1-sdk: unauthorized: incorrect username or password)

    今天看了下.net core 示例项目eShopWebOnline. 无奈在使用docker的时候总是提示一下错误信息,大致信息是用户名密码错误.但是,明明桌面右下角Docker帐号处于登录状态. E ...

  2. 将已经存在的异步请求callback转换为同步promise

    由于js是单线程执行,为防止阻塞,会有很多异步回调函数callback,嵌套层次多了,可读性就差了很多.随着社区的发展,出现了promise.我们来将一些常见的回调函数做修改,变成promise的链式 ...

  3. net读取文件字节流要注意的小细节

    ]; var numBytesToRead = (int)fileLenght; ; using (fs) { do { ); numBytesRead += n; numBytesToRead -= ...

  4. MyBatis insert/delete/update 的返回值

    insert,返回值是:新插入行的主键(primary key):需要包含<selectKey>语句,才会返回主键,否则返回值为null. <insert id="inse ...

  5. Vue使用过程中常见问题

    目录 一.vue监听不到state数组/json对象内的元素的值的变化,要手动通知触发 二.vue用splice删除多维数组元素导致视图更新失败情况 三.vue项目如何部署到php或者java环境的服 ...

  6. NOIP2013 D1T3 货车运输 zz耻辱记

    目录 先来证明下lemma: 图上2点间最小边权最大的路径一定在MST上 感性理解下: 每次kruskal algo都连接最大的不成环边 此时有2个未联通的联通块被连起来. 那么考虑u, v两点的联通 ...

  7. 【C语言编程练习】新娘与新郎

    1. 题目要求 新郎A,B,C与新娘 X,Y,Z.有人不知道她们谁和谁结婚了,询问了6位新人中的三位,A说他将和X结婚,X说她的未婚夫是C,C说她会和Z结婚,一听就知道是全是假话,请编程找出谁和谁结婚 ...

  8. Ubuntu全盘备份与恢复,亲自总结,实测可靠

    https://blog.csdn.net/sinat_27554409/article/details/78227496 Ubuntu全盘备份与恢复,亲自总结,实测可靠 初学者在使用Ubuntu这类 ...

  9. VMware ESXi 6.5 安装

    1.1下载esxi镜像 此处我使用的版本是:VMware-VMvisor-Installer-6.5.0-4564106.x86_64 1.2新建一个虚拟机,硬件兼容性处选择ESXI6.5 硬盘40g ...

  10. C#调用Interrop.excel导出Excel文件失败解决方案

    最近操作员反馈系统在导出Excel时失败,有抛出如下异常:系统错误信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失 ...