C - 捕获错误的参数错误

C - catching wrong parameter errors

我正在处理一个仅使用 C 的大型项目,但我一直被以下问题困扰:

假设我有一个函数

void MyFunction(int parameter)
{
    printf("parameter: %d\n", parameter);
}

通常会被调用

int aVariable = 5;
MyFunction(aVariable);

然而,显然由于 C 标准规范,这不会导致编译错误:

int aVariable = 5;
MyFunction(&aVariable); // No error signaled, but causes all sorts of mayhem

如何捕获这种错误,特别是在 Visual Studio 中?我可以打开任何设置以使其更严格吗? 您可能会推荐任何策略(除了 "don't make typos")?

编辑: 我可能会补充说,由于项目的(糟糕的)性质,示例代码已经生成了大量警告;我不确定我是否可以在我有的时间内删除所有这些。生成更多警告可能不是最佳选择——但是能够辨别这些特定警告(正如一个答案所暗示的那样)可能是解决这个特定问题的方法。

插入形式为

的函数声明
 void MyFunction(int parameter);

在尝试调用它之前。如果你不这样做,当调用 MyFunction() 时,C 编译器需要假设 MyFunction() 接受可变参数列表(任意数量和类型的参数)和 returns int.

因此,即使使用不正确的参数调用函数或调用代码尝试使用 return 值(不应使用 void 函数来完成),代码也将无错误地编译。结果,如果提供的参数与实际函数定义所期望的不匹配,则通常处于未定义行为的范围内。

在调用之前声明函数是一种很好的做法,它允许编译器检测问题,并根据需要发出错误或警告。如果没有声明,一些编译器会发出警告,但并非所有编译器都会发出警告。

如果函数 MyFunction 在调用点之前 使用原型 声明,则

MyFunction(&aVariable);

是C语言中真正成熟的约束违规,即我们通常所说的"an error"。这就是语言规范所说的。换句话说,您认为这在某种程度上是允许的 "due to the C standard specifications" 是不正确的:这是 C 标准明确禁止的。

任何C编译器都会对此类代码发出至少警告,您也应该注意。如果您的 C 编译器没有将此违规报告为 错误 ,通常可以通过编译器设置进行更改。

如果是Visual Studio编译器,一种方法是查看在这种情况下发出的警告编号,并要求编译器将此类警告转换为错误。这可以通过 #pragma warning 或项目设置来完成。