Chr*_*rck 11 c gcc c-preprocessor
为什么要__LINE__根据在类似函数的宏还是常规函数中使用它来进行不同的计算?
例如:
#include<stdio.h>
#define A() printf("%d\n",__LINE__);
int main(void) {
/* 6 */ A();
/* 7 */ A(
/* 8 */ );
/* 9 */ printf("%d\n",__LINE__
/* 10 */ );
}
Run Code Online (Sandbox Code Playgroud)
我希望得到:
6
7
9
Run Code Online (Sandbox Code Playgroud)
但是相反,我们得到了(使用clang-1000.10.44.4):
6
8
9
Run Code Online (Sandbox Code Playgroud)
请注意,在类似于函数的宏中,如何在行7和行8上进行分配,而不是使用第一行,而是占用最后一行。
GCC的文档提供了详细信息:https : //gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html
我为什么在乎?我正在编写一个解析器,该解析器需要查找宏的所有实例的行号,A以使其与__LINE__返回的内容对齐。由于需要解析可能转义的参数,因此很难找到宏用法的最后一行而不是第一行。
C实现在A()看到关闭之前不会替换宏)。它)出现在第8行,因此是发生宏替换的地方。
__LINE__C标准没有很好地指定有关宏替换的细节。您可能不应在此依赖特定的行为。当然,由于C实现无法A()读取该宏,因此它只能读取第7行,因为它尚不知道会发生什么。一旦看到关闭),那么当它替换宏时,它可能会考虑替换令牌出现在第7行或第8行或某种混合情况下-C标准对此并不专门;此时,行号在很大程度上与C语义无关,并且__LINE__宏在很大程度上为调试和其他开发工作提供了便利,而不是生产程序的功能(尽管它们可能有一些用途)。
在中printf,C实现在__LINE__看到行尾时会立即识别宏。(实际上,分析更复杂;输入已被标记化,但是效果是__LINE__当检查行尾字符时可以识别标记。)它位于第9行,因此被代替9。这是一个printf无关紧要的事实。C实现没有过程printf来替换__LINE__出现在第9行的令牌。他们不互动。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |