C语言中定义的反向

C语言中定义的反向,c,C,我有一个整数变量,例如int var1;在源代码中不应该是18。我的意思是,如果我的项目中有任何程序员写了以下内容: var1 = 18; 我使用的C99编译器将其设置为红色,并拒绝编译它。我想要像define这样的东西,但反过来,变量不能有特殊的值。在C语言中有可能吗?没有反向定义,也没有魔法。这是C。您可以: 编写一个函数并进行检查。我将看到assert为程序员编写断言: 编写您自己的编译器或使用插件修补现有编译器,该插件将专门执行您想要的操作-在编译时它将检查值是否为18,在运行时分配变

我有一个整数变量,例如int var1;在源代码中不应该是18。我的意思是,如果我的项目中有任何程序员写了以下内容:

var1 = 18;
我使用的C99编译器将其设置为红色,并拒绝编译它。我想要像define这样的东西,但反过来,变量不能有特殊的值。在C语言中有可能吗?

没有反向定义,也没有魔法。这是C。您可以:

编写一个函数并进行检查。我将看到assert为程序员编写断言: 编写您自己的编译器或使用插件修补现有编译器,该插件将专门执行您想要的操作-在编译时它将检查值是否为18,在运行时分配变量时,将插入额外的代码以检查值是否为18。
不要使用普通变量。将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;
}

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

var1 = 18;
像这样使用sed检查pb002.cpp文件:

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

使用函数分配值,该函数可以检查值是否不是18。如果C11是一个选项,则可以使用static_assertvar==18;,在C99上,您可以使用普通断言,但它在运行时工作。如果程序员编写var1=rand怎么办?你希望编译器也拒绝编译吗?@Barmar这是个好主意,但是任何程序员都可以使用=来赋值。@MohammadKholghi在调试器中,你可以监视一个变量,如果它被设置为某个特殊值,就可以中断它。例如,很好的尝试,但很容易被击败:var1=0x12;或突出排列var1,=和18;在2行或更多行上,更不用说嵌入的注释,或者不正当地使用预处理器:define var2 var1,var2=18;你能再解释一下吗?所有程序员都应该调用set_var1来设置特定变量吗?是的,这就是我的建议。请回答这个问题好吗。
sed -n '/^[[:blank:]]*[[:alnum:]]\{1,25\}[[:blank:]]*=[[:blank:]]*[0-9][0-9]*[[:blank:]]*;/p' pb002.cpp