2016-07-06 68 views
2

如您所知,c/C++中的macro__FILE__包含文件的路徑,它從編譯的位置開始。 例如:宏__FILE__與Gradle的奇怪行爲

gcc test.c -o test 
./test 
test.c 

gcc myFolder/test.c -o test 
./test 
myFolder/test.c 

但是當我嘗試用gradle這個編譯,它輸出的完整路徑,我的文件,如:

home/usr/myFolder/test.c. 

我想預編譯macro__FILE__只包含內部項目路徑,但不充分。

搖籃文件:

apply plugin: 'c' 

model { 
    components { 
      main(NativeExecutableSpec) { 
        sources { 
         c { 
          source { 
           srcDir "./" 
           include "*.c" 
          } 
         } 
        } 
      } 
    } 
} 

test.c的:

#include <stdio.h> 

void main(void) 
{ 
    printf("%s\n", __FILE__); 
} 

回答

0

__FILE__的行爲是明確的:那就是擴展到當前輸入文件的名稱,形式宏一個C字符串常量。

這是預處理器用於打開文件的路徑。

事實上,你得到整個路徑是可以預料的。

3

不幸的是,由於gradle調用編譯器的方式,這是預期的。如果你想獲得只是相對項目的路徑,你可以這樣做

#include <stdio.h> 

void main(void) 
{ 
    printf("%s\n", __FILE__ + PROJECT_PATH_LEN); 
} 

,然後添加的PROJECT_PATH_LEN一個合適的定義,以file("./").absolutePath.length(見gradle documentation on how to add defines)。