gpt4 book ai didi

c - 为什么需要确保 gcc 的 __COUNTER__ 宏在包含使用它的预编译头文件之前没有展开?

转载 作者:行者123 更新时间:2023-12-04 15:42:43 26 4
gpt4 key购买 nike

我遇到以下关于 __COUNTER__ 的词:

Care must be taken to ensure that __COUNTER__ is not expanded prior to inclusion of precompiled headers which use it. Otherwise, the precompiled headers will not be used.

我写了一个简单的代码来测试:

$ cat a.h
void func()
{
printf("%d\n", __COUNTER__);
}
func();

$ cat a.c
#include <stdio.h>


int main(void) {
printf("%d\n", __COUNTER__);
printf("%d\n", __COUNTER__);
#include "a.h"
printf("%d\n", __COUNTER__);
return 0;
}

构建并运行它:

$ cc a.c
$ ./a.out
0
1
2
3

它符合我的预期目标。那么如何理解“必须注意确保 __COUNTER__ 在包含使用它的预编译头文件之前不展开。”?

最佳答案

您显示的代码通常使用头文件,而不是使用预编译 头文件。请注意,您引用的限制仅适用于预编译 header 。

原因很简单,实际上:__COUNTER__ 的替换文本在每次扩展 __COUNTER__ 时都会发生变化。当使用 __COUNTER__ 的 header 被预编译时,在预编译时有效的替换文本将嵌入到预编译 header 中。

如果您在包含预编译 header 之前在代码中展开 __COUNTER__,则正常使用 header 与预编译 header 的结果会有所不同:正常包含将使用 __COUNTER__包含之前的用法当前修改的值,而预编译版本将包含替换文本,就像预编译 header 时一样。因此,不能使用预编译版本,因为它的内容是错误的。

关于c - 为什么需要确保 gcc 的 __COUNTER__ 宏在包含使用它的预编译头文件之前没有展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57217535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com