代码写好之后有时候需要在编译的时候选择编译哪部分代码,通过gcc参数 -D给c文件传递宏参数,下面是具体实现,-D和参数中间空格可以省略
makefile参数传递,make para=value
#include <stdio.h>
#ifdef DEBUG
const char *g_vision = "宏参数是debug";
#else /* DEBUG */
const char *g_vision = "宏参数是relese";
#endif /* DEBUG */
#if (FLAG == 1)
int g_flag = 1;
#else /* FLAG */
int g_flag = 0;
#endif /* FLAG */
int main(int argc, char *argv[])
{
printf("%s, flag = %d\n", g_vision, g_flag);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
OBJ=print
CC=gcc
VISION?=DEFAULT
INPUT?=0
$(OBJ):myprint.c
$(CC) -D $(VISION) -D FLAG=$(INPUT) $< -o $@
clean:
rm $(OBJ)
#!/bin/bash
read -p "脚本输入测试,传给c文件的flag为:" -t 10 temp
echo "输入的参数值为 flag = ${temp}"
make VISION=${1} INPUT=${temp}
./print 参数1 参数2 参数3
make clean
执行脚本的结果
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh DEBUG
脚本输入测试,传给c文件的flag为:1
输入的参数值为 flag = 1
gcc -D DEBUG -D FLAG=1 myprint.c -o print
宏参数是debug, flag = 1
argv[0] = ./print
argv[1] = 参数1
argv[2] = 参数2
argv[3] = 参数3
rm print
###################################################################
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh RELESE
脚本输入测试,传给c文件的flag为:2
输入的参数值为 flag = 2
gcc -D RELESE -D FLAG=2 myprint.c -o print
宏参数是relese, flag = 0
argv[0] = ./print
argv[1] = 参数1
argv[2] = 参数2
argv[3] = 参数3
rm print