最近项目要从windows平台移植到linux平台,所以做了很多兼容性相关的工作。遇到一个小问题,我想通过WIN32宏来区分两个平台,之前以外WIN32变量是自己定义到,所以我做了如下声明:

#define WIN32 1 //1:windows, 0:linux

程序中这样使用:

#if WIN32 1

     //do something in windows

#else

    //do something in linux

#endif

于是,把整个工程在linux平台下编译一遍,出现了很多编译错误,均来自于opencv到库文件,这是不能容忍的,为这个问题困扰了一天!

最终找到了答案,那是因为opencv在做兼容性时,windows用的就是WIN32这个宏,而且都是这样使用的:

#ifdef WIN32  

      //do something in windows

当程序中define了WIN32之后,就认为在linux下定义了WIN32,所以又去编译windows相关的东西,显然这是错误的。

所以,得出了结论:

1) WIN32宏是windows系统自带定义的宏,可直接使用,不用再去define

2) #ifdef的意思表示只要定义了就为真,所以使用时直接#ifdef WIN32,并且如果#define VAR 1,那么VAR就被定义,就可直接使用#ifdef VAR,而不管VAR是多少

3) #if的意思表示如果定义到宏是否为0,这时就要看宏到定义了,具体用时就是#if VAR 1.


一个小的知识点,就可以困扰你一天,终于明白编程规范是多么重要,谨记!

Logo

更多推荐