最近项目要从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.
一个小的知识点,就可以困扰你一天,终于明白编程规范是多么重要,谨记!