已解决, 我找到了一种通过宏和宏语法声明变量的解决方案,
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"
是否可以通过宏参数将变量分隔到不同的文件?
答案 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
命名错误是因为您不是在声明变量而是在定义变量。在标头文件中定义变量是一种不好的做法,因为如果在多个源文件中包含标头,您最终将在程序中使用它们的多个实例。