预处理器对“# <number> <filename>”做了啥?
Posted
技术标签:
【中文标题】预处理器对“# <number> <filename>”做了啥?【英文标题】:What does the preprocessor do with "# <number> <filename>"?预处理器对“# <number> <filename>”做了什么? 【发布时间】:2012-11-01 14:59:16 【问题描述】:我刚刚遇到了一个 C 文件,其中包含预处理器指令和如下所示的行:
# 9 "filename"
我以前从未见过这样的台词。他们的意思是什么?我猜这些是预处理器指令,但是预处理器对它们做了什么?
此外,对于某些行,字符串甚至不代表现有文件名...
【问题讨论】:
【参考方案1】:我相信这是使用 #line 预处理器指令的另一种方式。
例如你可以写:
// you could write #line 7 "filename" or
// # 7 "filename" or
// # 7 or
#line 7
int main(void)
printf("%d\n", __LINE__);
他们都会在stdout
上给你(在这种情况下)10
。
关于“文件名”部分的注释是可选的且未经验证(这就是为什么它可以是任何东西,甚至是不存在的文件)。我提供的链接中解释了它的使用 - If you specify a file name, the compiler views the next line as part of the specified file. If you do not specify a file name, the compiler views the next line as part of the current source file.
【讨论】:
哦,所以我的问题被误导了,毕竟那些是预处理器指令。 @Oak - 是的,它只是另一个预处理器指令。很好的问题,很难说他们什么时候不使用line
部分。
刚刚检查过,确实是这样 :) 谢谢!此外,该字符串似乎可以是我想要的任何字符串——即使它不是合法的文件名——它只会将其用作文件名(例如__FILE__
)。
它是#line 指令的变体,编译器可以看到,因此它知道要报告语法错误的行号等。从逻辑上讲,编译器只看到预处理的源,这甚至没有线边界。但是,如果编译器告诉您“令牌 325,419 有问题”,这将无济于事......以上是关于预处理器对“# <number> <filename>”做了啥?的主要内容,如果未能解决你的问题,请参考以下文章