gpt4 book ai didi

c - 是否可以在 C 中创建一个 "variable" header 保护名称?

转载 作者:行者123 更新时间:2023-12-01 23:43:34 26 4
gpt4 key购买 nike

各位程序员,

我是 C 预处理器的新手,最近一直在尝试在 C 中创建一个类似泛型的库(作为练习),但在创建 header 保护时遇到了一个小问题。

所有预处理器宏都已设置,因此我可以像这样包含和使用我的 header :

#define TYPE int
#include "myheader.h"
#undef TYPE

#define TYPE float
#include "myheader.h"
#undef TYPE

int main(void){
//Do stuff
MyFunc_int();

//More stuff
MyFunc_float();

return 0;
}

但是当我需要在多个文件中包含标题时,问题就出现了。在这种情况下通常应用 header 保护,但由于 header 可以包含一次 - 对于每种类型 - ,通常的构造和 #pragma once 都不能使用。

那么我的问题是:是否可以创建一个“可变的”header guard 来为不同的 TYPE 定义工作?

最佳答案

当你想包含来自不同编译单元的头文件时,你可以将头文件分成扮演头文件角色的公共(public)部分和扮演*.c角色的私有(private)部分> 文件,例如:

#define M_CONCAT(a, b) a##b

TYPE M_CONCAT(TYPE, _min)(TYPE a, TYPE b);

#ifdef IMPLEMENT

TYPE M_CONCAT(TYPE, _min)(TYPE a, TYPE b)
{
return (a < b) ? a : b;
}

#endif /* IMPLEMENT */

然后您可以从多个文件中包含此 header ,但您必须确保在包含 header 之前只有一个文件定义了IMPLEMENT:

#define IMPLEMENT    // only in one file

#define TYPE float
#include "myheader.h"
#undef TYPE

#define TYPE int
#include "myheader.h"
#undef TYPE

这个文件可以是一个单独的编译单元,myheader.c。但是,您必须注意为所有类型实现该功能。 (但链接器会告诉您,您错过了哪些类型。)

关于c - 是否可以在 C 中创建一个 "variable" header 保护名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172629/

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