2014-02-17 5 views
1

Если я сделаю это ниже:__FILE__ не дает полный путь

#include <stdio.h> 

int main() 
{ 

printf ("%s\n",__FILE__); 
return 0; 

} 

>gcc cfilename.c 
>./a.out 
>cfilename.c 
>pwd 
>/home/tek/cpp 
> gcc -v 
> gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 

только имя файла печатается, я думаю, он должен печатать его полный путь, поиск Google говорит мне, люди просят помощи, чтобы получить только имя файла?

+4

'__FILE__' просто передает все, что вы передали gcc; поэтому вы можете сделать это: 'gcc $ (pwd)/filename.c' –

+0

http://stackoverflow.com/questions/1591873/how-do-i-write-a-cpp-dir-macro-similar- to-file –

+0

спасибо, поняли. – user3317205

ответ

3

ISO-C стандарт (в настоящее время C11) это сказать о содержании __FILE__ предопределенного макроса:

__FILE__: Предполагаемое имя текущего исходного файла (строка символов литерал).

И вот об этом. Нет мандата на формат контента, поэтому я подозреваю, что реализация, вероятно, может уйти с установкой его на "some file I found in the /src tree" и все еще требовать соответствия.

Так что это в основном до реализации того, что оно там помещает. Вам нужно будет изучить конкретные реализации, чтобы увидеть, как они справляются с этим. gcc компилятор, например, использует файл именно так, как указано в командной строке, если вы хотите полный путь, это командная строка вам придется изменить, что-то вроде:

gcc -o myexec $(pwd)/myexec.c 

Это интересно отметить, что gcc, похоже, делает напротив для входящих файлов. При использовании:

#include "myheader.h" 

__FILE__ макрос устанавливается в полной мере расширения файла заголовка.


Если у вас есть реализация, которая не набор __FILE__ в порядке, вам нужно, то ничего не мешает вам создать свой собственный что-то вроде:

dodgycc -o myexec -DMY_FILE_NAME=$(pwd)/myexec.c myexec.c 

(где -D вариант компилятора dodgycc определяет токен препроцессора, который вам нужен).

+0

Исходные файлы всегда находятся на заданном пути относительно CWD, не имеют двусмысленности. Заголовок с указанным именем или токеном с включенным именем с несколькими компонентами находится по отношению к любому из сконфигурированных путей поиска заголовков. Если '__FILE__' не упоминает путь поиска, в котором был найден заголовок, то несколько файлов могут предоставить одно и то же значение для' __FILE__', что было бы неоднозначным. – Potatoswatter

+0

... Также следует отметить, что если вы хотите, чтобы '__FILE__' создавал конкретный результат, директива' # line' - это путь. Во всяком случае, +1. – Potatoswatter

Смежные вопросы