如何在声明变量的宏中实现ifdef?

时间:2019-10-31 07:15:00

标签: c macros c-preprocessor

已解决, 我找到了一种通过宏和宏语法声明变量的解决方案,

  

declare.c是由其他工具生成的,因此我无法对其进行修改。

[I_VAR.c]

#define _DECLARE_VAR_I TYPE NAME;
#define _DECLARE_VAR_U
#define DECLARE_VAR(TYPE, NAME, CLASS) \
_DECLARE_VAR_##CLASS(TYPE, NAME)
#include "declare.h"
#undef _DECLARE_VAR_I
#undef _DECLARE_VAR_U

[U_VAR.c]

#define _DECLARE_VAR_I
#define _DECLARE_VAR_U TYPE NAME;
#define DECLARE_VAR(TYPE, NAME, CLASS) \
_DECLARE_VAR_##CLASS(TYPE, NAME)
#include "declare.h"
#undef _DECLARE_VAR_I
#undef _DECLARE_VAR_U

我有一个宏来声明全局变量,并且该宏有一个语法调用“ class”,用于将这些声明分隔到不同的C文件中,但是预处理器显示了一个错误,因为我在宏中使用了“ ifdef”。 >

有什么想法吗?谢谢!

(1)宏

#define DECLARE_VAR(TYPE, NAME, CLASS) \
#ifdef CLASS \
TYPE NAME; \
#endif

(2) [declare.h]由工具生成

DECLARE_VAR(int, i0, I)
DECLARE_VAR(int, i1, I)
DECLARE_VAR(int, i2, I)
DECLARE_VAR(int, u0, U)
DECLARE_VAR(int, u1, U)
DECLARE_VAR(int, u2, U)

(3) [I_Var.c]

#define I
#include "declare.h"

[U_Var.c]

#define U
#include "declare.h"

是否可以通过宏参数将变量分隔到不同的文件?

2 个答案:

答案 0 :(得分:1)

您要有条件地定义内容。不要将必须定义的参数作为宏的参数。只需使用简单的dependencies { implementation 'com.github.bumptech.glide:glide:4.9.0' implementation 'jp.wasabeef:glide-transformations:3.3.0' } ,就可以立即清楚¹已定义哪个块。

#ifdef

当然,现在您必须找到一种方法来使其余的代码在#ifdef I int i0; int i1; int i2; #end #ifdef U unsigned int u0; unsigned int u1; unsigned int u2; #endif i0之间变得模糊。也许您想定义相同类型的变量,但不要定义相同的名称。可能您不想在这里使用u0,而是想要一个已定义的类型:

#ifdef

#define M_TYPE #include "declare.h" 中的

declare.h

在这里,您不能从相同的#ifndef M_TYPE #error "Forgot to define M_TYPE" #end M_TYPE i0; M_TYPE i1; M_TYPE i2; 文件中两次包含不同类型的declare.h

________
¹在这个简短的示例中。

答案 1 :(得分:1)

无需使用macro(),只需执行以下操作即可:

#ifdef I
    int i0;
    ...
#end

#ifdef U
    int u2;
    ...
#endif

请注意,使用宏和条件编译会掩盖事物;因此,仅在真正必要时使用它。

我对将两组定义放在同一declare.h中存有疑问。请考虑在您的declareU.h文件中同时包含一个declareI.h和一个#include以及一个简单的.c

然后,您的declare.h命名错误是因为您不是在声明变量而是在定义变量。在标头文件中定义变量是一种不好的做法,因为如果在多个源文件中包含标头,您最终将在程序中使用它们的多个实例。