__FILE__在.h它解决了什么

Pab*_*run 13 c macros c-preprocessor

是否存在关于如何在__FILE__宏中扩展宏的规范.h

如果我定义 foo.h

#define MYFILE __FILE__
Run Code Online (Sandbox Code Playgroud)

并将其包括在内 foo.c

#include "foo.h"

int main(){
  printf("%s",MYFILE);
  ....
}
Run Code Online (Sandbox Code Playgroud)

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

对不起应该是一个简单的问题.网络上的文档似乎存在冲突.对于它的价值VS2008回归,foo.c因为我期望....我想.我只是想确认这是否是定义的行为.

yan*_*yan 10

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

  • 我对'`__LINE__` 和`__FILE__` _after_ 预处理器解决的说法有疑问。它们由预处理器_by_解析;编译器本身看不到下划线符号。 (2认同)

Jon*_*ler 10

yan回答中给出的建议是"一般正确".也就是说,值__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
$
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*rth 5

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