gpt4 book ai didi

c - 带有防护装置的多重包含 header

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:57 24 4
gpt4 key购买 nike

假设我有一个特殊的头文件,它被设计成被多次包含,并根据某些宏的值生成不同的代码,这些宏必须在包含它之前定义。例如,以下文件 dumb.h:

#define RETFUNC return_ ## VALUE
static inline int RETFUNC() {
return VALUE;
}

你把它包括在内:

#define VALUE 100
#include "dumb.h"
#define VALUE 200
#include "dumb.h"

它会生成两个版本的函数,例如:

static inline return_100 {
return 100;
}

static inline return_200 {
return 200;
}

很棒1

如何为这种类型的文件制作标题保护?如果没有守卫,如果头文件的两个不同使用者都请求相同的 VALUE,您会收到错误,因为会生成两个相同版本的 return_* 函数。

现在是一个普通的头球后卫:

#ifndef DUMB_H_
#define DUMB_H_
...
#endif // DUMB_H_

不会起作用,因为它只会有效地包含文件一次(上面的 #include 序列会生成函数的 _100 版本,但不会生成_200 版本)。

原则上,我想使用 token 粘贴生成宏的名称,以作为守卫进行检查,例如:

#ifndef DUMB_H_ ## VALUE
#define DUMB_H_ ## VALUE
...

但是 token 粘贴不能像那样使用(在宏扩展之外)。

是否有任何其他选项可以防止此文件使用相同的 VALUE 被多次包含,但仍然允许主体被有效包含一次用于每个不同的 VALUE 要求?


1 不是伟大,因为这是一个很好的模式或类似的东西,但它至少看起来有效。

最佳答案

comment 1中的解释和 comment 2 ,我觉得正常的流程比较像这样。我将使用一个类型作为参数,并为不同的类型生成一个“最小”函数:

哑巴.h

#ifndef DUMB_H_INCLUDED
#define DUMB_H_INCLUDED

#define MIN_TYPE(x) \
static inline x min_ ## x(x v1, x v2) { return (v1 < v2) ? v1 : v2; }

#endif /* DUMB_H_INCLUDED */

消费者代码

#include "dumb.h"
#include <inttypes.h>

MIN_TYPE(int) // No semicolon; no empty declaration!
MIN_TYPE(double)
MIN_TYPE(uint64_t)

void write_minima(int i1, int i2, double d1, double d2, uint64_t u1, uint64_t u2)
{
printf("Minima: (%d, %g, %" PRIu64 ")\n",
min_int(i1, i2), min_double(d1, d2), min_uint64_t(u1, u2));
}

这不会阻止您尝试在单个 TU(翻译单元)中两次实例化相同的函数,但如果您这样做,编译器会反对。坦率地说,让编译器进行提示比试图让 C 预处理器发现你搞砸了并纠正你的错误要简单。

如果 C 代码将由另一个程序生成,那么您需要确保代码生成器跟踪它所请求的内容,并确保它不会重复生成代码。

关于c - 带有防护装置的多重包含 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47706465/

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