GCC:-DVAR = -linux无法正常运行在Linux上

问题描述:

我有以下的C程序:GCC:-DVAR = -linux无法正常运行在Linux上

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上,所有东西都可以正常工作。 我不知道它是一个错误还是我做错了什么。

+2

可能与扩展的'linux'宏有冲突。 –

+1

这个宏的目的是什么?它应该解决的实际问题是什么?也许你应该将宏扩展定义为一个字符串开始? –

+0

我有'-linux'里面的路径,我通过'-D',所以我无法避免它。 – ziomq1991

您可以通过使用-undef,编译目标文件时,抑制系统 - 或GCC特定宏的定义:

gcc -undef -c -DVAR=-linux test.c 
gcc test.o -o test 

然后当您希望您的宏应该工作。 但是,请注意,您不能使用任何这些预定义的宏,那么您应该只将它用于那些绝对必须的对象文件。

+0

它的工作原理,谢谢:)我有'-linux'里面的路径,我通过'-D'传递,所以我无法避免它。 – ziomq1991