预处理器对“# <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>”做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle优化器对谓词顺序处理的一个场景

如何获得分类器对sklearn中预测的置信度分数?

通用选择器对性能有何影响?

分类器对opencv人脸检测器的信心

Java 信任管理器对过期证书的行为

多层感知器对 mnist 数据集进行分类