Pab*_*run 13 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?(是的,我意识到这是一个愚蠢的例子)
对不起应该是一个简单的问题.网络上的文档似乎存在冲突.对于它的价值VS2008回归,foo.c因为我期望....我想.我只是想确认这是否是定义的行为.
yan*_*yan 10
它将始终返回使用它的.c,__LINE__并__FILE__在预处理器之后解析.这样,您可以编写使用调试宏__FILE__和__LINE__,并让它们指向调试语句出现在哪里.
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
$
这是一个人为的例子; 在C中,你很少将实际代码放入标题中,就像我在这里所做的那样 - 除非你使用的是inline函数.但是输出显示在某些情况下标题的名称可以是__FILE__扩展为的正确名称.