是否可以在C中创建“变量”标题保护名称?

时间:2015-05-11 16:13:30

标签: c header c-preprocessor

其他程序员,

我是C预处理器的新手,并且最近尝试在C中创建类似通用的库(作为练习),并且在创建标题保护时我遇到了一些问题。

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

#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;
}

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

我的问题是:是否可以创建一个“变量”标题保护程序来处理不同的TYPE定义?

3 个答案:

答案 0 :(得分:2)

如果要包含来自各种编译单元的标头,可以将标题分为扮演标题角色的publich部分和扮演*.c文件角色的私有部分,例如:

#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 */

然后,您可以从多个文件中包含此标头,但在包含标头之前,您必须确保只有一个文件定义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。但是,您必须注意为所有类型实现该功能。 (但是链接器会告诉你,你错过了哪些类型。)

答案 1 :(得分:1)

我建议:

  1. 删除cost中的currency警卫。
  2. 为每个public class Money { @JacksonXmlProperty(isAttribute = true) public final String id; public final String description; private final String currency; private final Double cost; @JsonCreator public Money(@JsonProperty("id") String id, @JsonProperty("description") String description, @JsonProperty("currency") String currency, @JsonProperty("cost") Double cost) { this.id = id; this.description = description; this.currency = currency; this.cost = cost; } public String getId() { return id; } public String getDescription() { return description; } public String getCurrency() { return currency; } public Double getCost() { return cost; } } 创建不同的标头文件。
  3. intheader.h:

    #include

    floatheader.h:

    myheader.h

    然后使用:

    TYPE

答案 2 :(得分:0)

我认为你正在寻找这样的东西:

#if !defined HEADERGUARD && defined (TYPE==int)
#define HEADERGUARD
<stuff>
#endif

您可能希望拥有HEADERGUARD_int和HEADERGUARD_float,具体取决于您在* .h文件中所执行的操作。更常规的是,人们会把它分成两个* .h文件。