【问题标题】:Reverse of #define in CC中#define的逆向
【发布时间】:2020-12-01 06:28:51
【问题描述】:

我有一个整数变量(例如int var1;),它在源代码中不应该是“18”。我的意思是,如果我项目的任何程序员写了这个:

var1 = 18;

编译器(我使用 C99)使它变红,并拒绝编译它。我想要#define 之类的东西,但反过来(变量不能有特殊值)。 C语言可以吗?

【问题讨论】:

标签: c


【解决方案1】:

不要使用普通变量。使var1 成为扩展为函数调用的宏,然后您不能分配给它。然后您可以要求使用另一个函数来分配隐藏值,它可以检查该值是否为 18。

#define var1 (get_var1())

static int hidden_var1;

int get_var1() {
    return hidden_var1;
}

int set_var1(int new_value) {
    if (new_value != 18) {
        hidden_var1 = new_value;
    }
    return hidden_var1;
}

【讨论】:

  • 您能解释一下吗?所有程序员都应该调用 set_var1 来设置特定变量吗?
  • 是的,这就是我推荐的。
【解决方案2】:

在编译前使用 sed 等文本工具检查源代码。 您可以寻找有罪的文字编号分配

var1 = 18;

像这样使用 sed 来检查 pb002.cpp 文件:

sed -n '/^[[:blank:]]*[[:alnum:]]\{1,25\}[[:blank:]]*=[[:blank:]]*[0-9][0-9]*[[:blank:]]*;/p' pb002.cpp

【讨论】:

  • 不错的尝试,但很容易失败:var1 = 0x12; 或将var1=18; 分散在 2 行或更多行上,更不用说嵌入式 cmets 或对预处理器的不当使用:#define var2 var1var2 = 18;
【解决方案3】:

没有“反向#define”,也没有魔法。这是 C。你可以:

  • 编写一个函数并进行检查。我会看到assert 为程序员写一个断言:

void set_var1(int val) {
   assert(val != 18);
   var1 = val;
}
  • 编写您自己的编译器或使用插件修补现有编译器,该插件将专门执行您想要的操作 - 在编译时它将检查值是否不是 18,在分配变量时将插入附加代码以检查是否值不是 18。

【讨论】:

猜你喜欢
  • 2015-08-15
  • 2012-05-01
  • 2010-10-12
  • 2011-01-17
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多