【发布时间】:2021-01-25 14:56:45
【问题描述】:
我的 makefile 中有一个名为 SELF 的变量,我想通过 -D 选项将它传递给我的 GCC 编译器来定义一个宏。这个宏在 [0-9a-zA-Z] 中只能有一个字符-但这本身就是另一个问题,我不会在这里讨论-。 我很难找到一种解决方法来避免 GNU Make 和 shell 删除定义中的逗号。 它的定义示例如下:
#include <stdio.h>
#define str(x) #x
#define xstr(x) str(x)
#ifndef SELF
# define SELF '0'
#endif
#pragma message("SELF is: " xstr(SELF))
int main(void){
return 0;
}
makefile 如下所示:
CC = gcc
WFLAGS = -Wall -Wextra
ifdef SELF
DSELF = -DSELF=$(SELF)
endif
CFLAGS = -std=c99 $(DSELF)
all: clean test
%: %.o
.PHONY: clean
clean:
-rm -v test
如果您使用make 执行makefile,将出现一个注释,将标记SELF 的定义:
test.c:9:9: note: ‘#pragma message: SELF is: '0'’
9 | #pragma message("SELF is: " xstr(SELF))
| ^~~~~~~
另一方面,执行make SELF='0' 会破坏撇号,正如您在 GNU Make 的详细输出中所见:
gcc -std=c99 -DSELF=0 test.c -o test
如果您尝试用引号将撇号括起来,例如 make SELF="'0'",则定义将传递给 GCC,但即使是外壳程序也会删除撇号,因为 #pragma 消息仍将显示 0。但是如果直接执行gcc -std=c99 -DSELF="'0'" test.c -o test,定义就成功了:
test.c:9:9: note: ‘#pragma message: SELF is: '0'’
9 | #pragma message("SELF is: " xstr(SELF))
| ^~~~~~~
如何避免这一切发生?这是否意味着您不能定义相同类型的字符串?
【问题讨论】:
-
我自己可能已经回答了。如果您将: DSELF = -DSELF=$(SELF) 替换为: DSELF = -DSELF=\'$(SELF)\' 您写入“make SELF=”的任何内容都将用撇号定义,但如果您一开始没有写撇号或引号。