2017-10-13 75 views
2

我有以下的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

回答

2

您可以通過使用-undef,編譯目標文件時,抑制系統 - 或GCC特定宏的定義:

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

然後當您希望您的宏應該工作。 但是,請注意,您不能使用任何這些預定義的宏,那麼您應該只將它用於那些絕對必須的對象文件。

+0

它的工作原理,謝謝:)我有'-linux'裏面的路徑,我通過'-D'傳遞,所以我無法避免它。 – ziomq1991