__FILE__在.h它解决了什么

时间:2011-02-18 23:20:16

标签: c macros c-preprocessor

是否有关于如果__FILE__位于.h范围内foo.h宏将如何展开的规范?

如果我在#define MYFILE __FILE__

中定义
foo.c

并将其包含在#include "foo.h" int main(){ printf("%s",MYFILE); .... }

foo.h

输出foo.c还是foo.c? (是的,我意识到这是一个愚蠢的例子)

对不起应该是一个简单的问题。网络上的文档似乎存在冲突。值得一提的是VS2008以{{1}}的形式回归,这是我所期待的......我想。我只是想确认这是否是定义的行为。

5 个答案:

答案 0 :(得分:10)

它将始终返回使用它的.c,因为__LINE____FILE__在预处理器之后被解析。这样,您可以编写使用__FILE____LINE__的调试宏,并让它们指向调试语句出现的位置。

答案 1 :(得分:10)

yan answer中给出的建议“通常是正确的”。也就是说,__FILE__的值是使用宏时当前源文件的名称,而不是定义宏时的名称。但是,这不是绝对正确的 - 这是一个反例:

$ cat x.h
static void helper(void)
{
    printf("%s:%d helper\n", __FILE__, __LINE__);
}
$ cat x.c
#include <stdio.h>
#include "x.h"

int main(void)
{
    helper();
    printf("%s:%d\n", __FILE__, __LINE__);
    return 0;
}

$ make x
cc -Wall -Wextra -std=c99 -g x.c -o x
$ ./x
x.h:3 helper
x.c:7
$

这是一个人为的例子;在C中,你很少将实际代码放入标题中,就像我在这里所做的那样 - 除非你使用inline函数。但是输出显示,在某些情况下,标题的名称可以是__FILE__扩展为的正确名称。

答案 2 :(得分:5)

宏扩展(所有宏,而不仅仅是__FILE__之类的特殊宏)在 #include替换之后完成,所以是的,这种行为可以依赖。

答案 3 :(得分:4)

标准中的实际语言是(§6.10.8):

  

__FILE__当前源文件的假定名称(字符串文字)。

因为在处理#include之后发生了宏扩展,所以“当前源文件”是正在编译的预处理.c文件。

答案 4 :(得分:3)

#define宏执行文本文本替换预编译。当C编译器命中你的foo.c文件时,它会看到:

printf("%s", __FILE__);

所以你得到了foo.c。