//file1.c
#include <stdio.h>
void p(int a)
{
printf("%d\n",a);
}
//file2.c
extern void p(float x); // external declaration doesn't match definition
int main(){
float b;
b=3.333f;
p(b);
}
这里的外部声明是错误的,它与实际的函数定义不同。我编译并链接这两个文件:
gcc -Wconversion -Wall -std=c99 file1.c file2.c
没有发出警告。是否有任何 gcc 编译器选项可以帮助在编译/链接期间捕获这种不匹配?
编译器在编译 file2.c 时不可能观察到其中的声明与 file1.c 中的声明不匹配,因为在编译 file2.c 时,编译器不知道 file1 的内容。 C。
一些链接器具有可以帮助解决此问题的功能。但是,这不是链接 C 对象的常见做法。(也许应该是。)
这种不匹配通常是通过使用头文件来处理的。压倒性的普遍做法是从头文件中包含声明,而不是在其他源文件中手动输入它们。去做这个:
void p(int a);
其中。#include "file1.h"
.#include "file1.h"
和删除p
.在 file1.c 中包含 file1.h 的目的是让编译器可以看到 file1.h 中的声明和 file1.c 中的定义,如果它们不兼容,它会抱怨。
然后,由于 file1.h 包含在 file2.c 中,我们可以确保编译 file2.c 时看到的声明与 file1.c 中的定义兼容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句