c、c++利用linux、unix编译器gcc、g++、xlc(makefile)的-D参数定义宏、进而直接修改、定义代码中的变量值

实现目的

  • 代码中定义一个变量,变量的值希望在不改变代码的情况下能自定义改变、调整(这里不考考所谓的读配置、参数传入的方式),只允许重新编译;

利用编译器的宏定义功能实现

  • 做c、c++开发的都知道编译器gcc、g++有个-D的参数;定义宏的功能
  • 一般情况下我们只用来做条件编译,即某段代码在不修改代码的前提,想让他在某种环境下临时生效,之后又可以还原回来;也就我们进程用的利用条件编译+代码通过#ifdef...#endif输出debug日志,比如在开发环境时尽可能的输出详细日志,到时生产发布时那些日志都屏蔽输出了;具体实现如下:
// main.cpp 文件内容
#include
#include
using namespace std;
int main(int argc,char**argv){
cout<<"hello world!!!"<#ifdef DEBUG
cout<<"MARCRO DEBUG defined ..."<#endif
return 0;
}
//makefile 文件内容
MACRO =
EXE=run
build:exe
exe:$(EXE)

$(EXE):main.o
        g++ -o  $(EXE) main.o 
main.o:main.cpp
        g++ -c $(MACRO) main.cpp
clean:
        rm *.o $(EXE)

通过以上代码,默认情况下是非debug模式也就不会输出MARCRO DEBUG defined ...这句;如果想让其输出的话只要重新编译下:make MARCO=-DDEBUG 那么代码就进入了debug模式也就会打印出那行日志了;比较常用宏定义也就拿做这样的条件编译;

  • 当然预定义宏-D是支持赋值的比如-DDEBUG=1那么代码中哦你就可以这么用#ifcout<<"debug info"<判断那么也是满足条件输出日志信息的;所以我们可以借助这一点实现我们一开始的目标就是代码中的一个变量值只允许重新编译的情况下临时改变变量的值;具体实现如下:
//main.cpp 内容
#include
#include
using namespace std;

// 注意代码中不要定义这个宏要不然编译时就重复定义了
//#define LENGTH 20
int main(int argc,char**argv){
cout<<"hello world!!!"<int i=LENGTH;
cout<<"i="<return 0;
}
//makefile 内容

//这里的宏给个默认值要不然未知
MACRO =-DLENGTH=11
EXE=run
build:exe
exe:$(EXE)
$(EXE):main.o
        g++ -o  $(EXE) main.o 
main.o:main.cpp
        g++ -c $(MACRO) main.cpp
clean:
        rm *.o $(EXE)

现在我们正常make编译,进程输出的结果是11;如果我们想临时改变代码中i变量的值那么只需按make MACRO="-DLENGTH=22"重新编译即可;那么输出的结果就变成了22
注意:1、上面代码中一定不要define 那个宏 要不然会引起重复;2、makefile或者单独gcc、g++时-DLENGTH=1要给个某人值;

你可能感兴趣的:(makefile,c++,unix,linux,gcc/g++/xlc)