我的a.c文件:
int sum(int a, int b) {
return a + b;
}
我的b.c文件:
#include<stdio.h>
extern int sum(int, int);
int main() {
printf ("%d", sum(2, 3));
return 0;
}
gcc a.c b.c -o输出,工作正常。
明天我说,我通过将参数增加到三来改变“a.c文件”和函数的定义。像这样,
int sum(int a, int b, int c) {
return a + b + c;
}
但是忘了改变b.c文件中的用法(意味着我还在使用两个变量)
gcc a.c b.c -o输出(不给出编译错误或警告mssg,printf给出错误答案,显然)
现在考虑我正在处理大量的c文件,我无法创建新的头文件,因为它会产生不必要的依赖问题,这可能需要很长时间才能解决。
如果在参数方面更改了extern原始定义,抛出错误甚至警告消息的最佳方法是什么?
此致
答案 0 :(得分:2)
如果
extern
原始定义在参数方面发生变化,抛出错误甚至警告消息的最佳方法是什么?
编译器和链接器都不会反对。当程序停止工作时,您将在运行时(如果幸运的话)找到答案。
如果这是C ++,那么名称修改将允许链接器拒绝这种错误形成的程序。但是,对于C,链接器只需要找到具有正确名称的符号。它无法检查签名。
使用头文件是让编译器确保您正确执行操作的可接受方法。在整个程序中反复重复函数声明通常是一个非常糟糕的主意。与您提出的方法相比,您认为使用标题文件的任何缺点都显得微不足道。
如果您根本不使用头文件,那么您必须始终是正确的!
答案 1 :(得分:1)
通常编辑器(SourceInsight,Sublime)可以选择浏览符号。通过使用此选项,您可以轻松找到函数调用和原型。
编译器永远不会为您的问题生成警告或错误。自己包含的头文件是避免这种情况的最佳选择。
答案 2 :(得分:0)
最好的办法是尽量避免使用“extern”并包含sum()的头文件。使用头文件和原型设计功能将有助于编译器捕获这些问题。
test.c的:
#include <stdio.h>
#include "math.h"
int main(void)
{
printf("%d", sum(2, 3));
return 0;
}
math.h中:
int sum(int a, int b, int c)
{
return (a + b + c);
}
输出:
~]$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6:5: error: too few arguments to function ‘sum’
printf("%d", sum(2, 3));
^
In file included from test.c:2:0:
math.h:1:5: note: declared here
int sum(int a, int b, int c)