在 C 中使用较少数量的参数调用函数?

calling function with lesser number of arguments in C?

我奇怪地发现 C 允许链接参数列表不匹配的函数:

//add.c
int add(int a, int b, int c) {
    return a + b + c;
}
//file.c
int add (int,int); //Note: only 2 arguments
void foo() {
    add(1,2);
}

我先编译了add.c,再编译了file.c,都编译成功了。奇怪的是,链接器没有给出任何类型的错误或警告,原因可能是 C 链接器在链接时不比较参数。不过,我不是 100% 确定。有人请对此发表评论。

现在,问题是避免这种情况或在编译期间得到某种警告的最佳做法是什么,因为在我的项目中,不同文件中有很多函数,现在和然后我们必须添加一些函数中的额外参数。

正确使用头文件。
配置您的编译器以发出尽可能多的警告。
注意警告!

add.h

#ifndef ADD_H_INCLUDED
#define ADD_H_INCLUDED
int add(int a, int b, int c);
#endif

add.c

#include "add.h"
int add(int a, int b, int c) {
    return a + b + c;
}

file.c

#include "add.h"
void foo() {
    add(1, 2);
}

使用很少的参数调用函数会导致 undefined behavior,因为这些参数的值将是不确定的。

C linker doesn't compare arguments while linking.

没错。与将参数类型视为函数签名的一部分的 C++ 链接器不同,C 链接器仅考虑函数名称。这就是为什么只需按照您显示的方式提供错误的函数原型就可以创建具有未定义行为的情况。

what is the good practice to avoid this situation or get some sort of warning during compilation?

始终将您打算共享的函数原型放入 header,并在使用函数的地方和定义函数的地方包含 header。这将确保编译器发出诊断消息。将所有编译器警告视为错误。 C 编译器通常比较宽容,因此它们的警告通常表示非常重要的事情。