是否有关于如果__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}}的形式回归,这是我所期待的......我想。我只是想确认这是否是定义的行为。
答案 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。