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. knn算法详解

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  2. kafka单节点的安装,部署,使用

    1.kafka官网:http://kafka.apache.org/downloads jdk:https://www.oracle.com/technetwork/java/javase/downl ...

  3. java时间处理,获取当前时间的小时,天,本周周几,本周周一的日期,本月一号的日期

    1.时间转时间戳 public static long strToTimestamp(String dateTimeStr) throws Exception { Timestamp time = T ...

  4. linux - word frequency

    linux  输出某个文件的单词出现频率 解决方式 cat words.txt |awk '{for(i=1;i<=NF;i++) print $i;}'|sort|uniq -c|sort - ...

  5. TextBox使用技巧--转载

    [转载出处注明:http://tieba.baidu.com/p/3677706825] 在使用Visual Basic开发应用程序时,TextBox控件是最常用的(特别对于数据库程序),以下是笔者在 ...

  6. 【Java并发编程一】线程安全问题

    1.多线程的实现 多线程有两种实现方式: 1.1.继承Thread类 =>示例:A a=new A(); a.start();   1.2.实现Runnable接口 =>示例:A a=ne ...

  7. 【redis】在dotnet core下的redis的使用

    1.Install-Package Microsoft.Extensions.Caching.Redis -Version 2.2.0 2.注入 services.AddDistributedRedi ...

  8. cn microsoft hyper-v server 2016 安装笔记

    英文版,先用,随后 中文版再出笔记 不知道是不是 WINDOWS 7 USB DVD TOOLS 没有更新,怎么做不了优盘启动,只能找个 替代工具RUFUS.

  9. 动态规划——Palindrome Partitioning II

    Palindrome Partitioning II 这个题意思挺好理解,提供一个字符串s,将s分割成多个子串,这些字串都是回文,要求输出分割的最小次数. Example:Input: "a ...

  10. iOS 上传自己的工程(模块工具类)到cocoapods上遇到坑

    最近在研究把自己写的工具类和模块上传到cocoapods上, 再新构建项目中可以直接使用cocoapods使用  也可以更新之前的版本 便于维护项目. 但是在这个过程中遇到了种种问题 但是最后还是解决 ...