C __文件\未给出完整路径

C __文件\未给出完整路径,c,C,如果我在下面这样做: #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) #包括 int main() {

如果我在下面这样做:

#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)
#包括
int main()
{
printf(“%s\n”,文件);
返回0;
}
>gcc cfilename.c
>/a.out
>cfilename.c
>pwd
>/home/tek/cpp
>gcc-v
>gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)
只打印文件名,我认为它应该打印完整的路径,google search告诉我有人请求帮助以获取唯一的文件名?

ISO C标准(目前为C11)对预定义宏的内容有以下说明:

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

就这样。没有关于内容格式的规定,因此我怀疑实现可能会将其设置为
“我在/src树中找到的某个文件”
,并且仍然声称符合要求

所以它基本上取决于它的实现。您需要调查具体的实现,看看它们是如何处理的。例如,
gcc
编译器完全按照您在命令行上指定的方式使用文件,因此,如果您想要完整路径,则必须更改命令行,例如:

gcc -o myexec $(pwd)/myexec.c
dodgycc -o myexec -DMY_FILE_NAME=$(pwd)/myexec.c myexec.c
有趣的是,对于包含的文件,
gcc
似乎正好相反。使用时:

#include "myheader.h"
\uu文件\uu
宏设置为头文件的完全扩展


如果您的实现没有按您需要的方式设置
\uuuuu文件
,那么没有什么可以阻止您使用以下内容创建自己的实现:

gcc -o myexec $(pwd)/myexec.c
dodgycc -o myexec -DMY_FILE_NAME=$(pwd)/myexec.c myexec.c
(其中,
dodgycc
编译器的
-D
选项定义了一个预处理器令牌作为您所需要的内容)。

ISO C标准(当前为C11)对
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu预定义宏的内容有如下说明:

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

就这样。没有关于内容格式的规定,因此我怀疑实现可能会将其设置为
“我在/src树中找到的某个文件”
,并且仍然声称符合要求

所以它基本上取决于它的实现。您需要调查具体的实现,看看它们是如何处理的。例如,
gcc
编译器完全按照您在命令行上指定的方式使用文件,因此,如果您想要完整路径,则必须更改命令行,例如:

gcc -o myexec $(pwd)/myexec.c
dodgycc -o myexec -DMY_FILE_NAME=$(pwd)/myexec.c myexec.c
有趣的是,对于包含的文件,
gcc
似乎正好相反。使用时:

#include "myheader.h"
\uu文件\uu
宏设置为头文件的完全扩展


如果您的实现没有按您需要的方式设置
\uuuuu文件
,那么没有什么可以阻止您使用以下内容创建自己的实现:

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

(其中,
dodgycc
编译器的
-D
选项定义了一个预处理器令牌,作为您所需要的内容)。

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>只是将您传入gcc的内容传递出去;因此,您可能需要这样做:
gcc$(pwd)/filename.c
\uuuu FILE\uuuuu
只需将您传递给gcc的内容传递出去;因此,您可能需要这样做:
gcc$(pwd)/filename.c
源文件始终位于给定路径,相对于CWD,没有歧义。相对于任何已配置的标头搜索路径,可以找到具有给定名称的标头或包含多个组件的名称标记。如果
\uuuuuuuuuuuuuuuuuuuuuuu
没有提到头所在的搜索路径,那么多个文件可以为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
提供相同的值,这将是不明确的……另外值得一提的是,如果您想要
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。无论如何,+1.源文件总是在给定的路径上找到,相对于CWD,没有歧义。相对于任何已配置的标头搜索路径,可以找到具有给定名称的标头或包含多个组件的名称标记。如果
\uuuuuuuuuuuuuuuuuuuuuuu
没有提到头所在的搜索路径,那么多个文件可以为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
提供相同的值,这将是不明确的……另外值得一提的是,如果您想要
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。不管怎样,+1。