【问题标题】:What does the preprocessor do with "# <number> <filename>"?预处理器对“# <number> <filename>”做了什么?
【发布时间】:2012-11-01 14:59:16
【问题描述】:

我刚刚遇到了一个 C 文件,其中包含预处理器指令和如下所示的行:

# 9 "filename"

我以前从未见过这样的台词。他们的意思是什么?我猜这些是预处理器指令,但是预处理器对它们做了什么?

此外,对于某些行,字符串甚至不代表现有文件名...

【问题讨论】:

    标签: c c-preprocessor


    【解决方案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 有问题”,这将无济于事......