我有以下C程序:
test.c的
#include <stdio.h>
#define DEF0(v) #v
#define DEF(v) DEF0(v)
int main()
{
printf("RUNNING... %s\n", DEF(VAR));
}
汇编
gcc -DVAR=-linux test.c
运行
./a.out
给出
RUNNING... -1
Asm输出
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "-1"
.LC1:
.string "RUNNING... %s\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
movl $.LC0, %esi
movl $.LC1, %edi
xorl %eax, %eax
jmp printf
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
.section .note.GNU-stack,"",@progbits
-linu
或-linuxx
不会导致此类问题,但-linux/
会造成此问题。引号-DVAR="-linux"
周围没有帮助。
在gcc 6和7上也可以看到问题。在cygwin上,每个人的工作都很精细。 我想知道这是一个错误还是我做错了什么。
答案 0 :(得分:2)
在编译目标文件时,可以使用-undef
禁止系统或gcc特定宏的定义:
gcc -undef -c -DVAR=-linux test.c
gcc test.o -o test
然后你的宏应该按预期工作。 但请注意,您不能使用任何这些预定义的宏,您应该只在那些必须使用的目标文件上使用它。