隐藏宏的C技巧?

韦伯

我有一个包含少量文件的项目:source1.c source2.c source1.h source2.h。现在,source1.c声明了一些变量,并且source1.h将其外部化(带有条件构建宏)。然后,source2.c将通过为extern变量分配值来使用它们。

问题是source1.h具有如下内容:

#ifdef CUST1
extern type var_name;
#else
// Need to extern something or use a clever macro here but i dont like these below
//#define var_name int x (requires top of scope block usage)
//#define var_name // (doesnt compile)
//#define var_name -1 (simply doesnt compile)
//#define var_name 1= (This seems like it would reduce to unused 1==1; but doesnt work)
#endif

我的构建适用于CUST1,但不适用于CUST2,因为当在source2.c中引用var_name时,它永远不会声明/退出作用域。

我不想将var_name用于CUST2,它在source2.c中是无法访问的代码。这是我的问题,我如何使用宏#define var_name以便分配“消失”或什么都不做?

我可以“ #define var_name int x”。这会将int x放在source2.c函数的堆栈中,并在source2.c中分配值,但是如果在作用域块顶部以外的任何地方引用了它,那么我的旧(C89?)编译器将出错。

例如,如果source2.c具有以下内容,则将无法编译:

unsigned short local_var = 0;
local_var = 1; //or someother value
var_name = local_var * 2;

我可以使用相同的#ifdef CUST1宏将逻辑包装在source2.c中,但这似乎也不太好。

如果只是将var_name与之进行比较,那不会太糟糕,因为我可以只使用#define var_name -1,否则将使所有比较/切换失败。问题是-1 = temp_var; 无法编译,因为-1不能是左值。

类似地,我无法“ #define var_name //”,因为在根据此替换marcos之前已删除注释:您可以在C中#define注释吗?

是否有一个巧妙的宏技巧可以隐藏/删除此分配,而不会在堆栈上放置local_var?我觉得三元数有可能出现,但我想不到。

编辑最小示例代码:

来源1.c

int var_name = 0;

source1.h

#ifdef CUST1
extern int var_name;
#else
// clever macro
#endif

source2.c

#include "source1.h"
int main(){
  var_name = 1;
  return 0;
}
咖啡馆

如果未定义var_nameinsource2.c访问的代码无法访问CUST1(如您所说),则可以这样定义:

#include <stdlib.h>

#define var_name (*(abort(), (type *)0))

在语法上,它可以作为正确类型的左值(或右值)使用,但是如果程序曾经被执行过,它将中止该程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章