其他程序员,
我是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
定义?
答案 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)
我建议:
cost
中的currency
警卫。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;
}
}
创建不同的标头文件。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文件。