gpt4 book ai didi

c - 是否有 gcc 编译器选项可帮助捕获形式参数和实际参数类型不匹配?

转载 作者:太空宇宙 更新时间:2023-11-04 05:32:35 25 4
gpt4 key购买 nike

//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 时,编译器不知道其内容文件 1.c.

某些链接器具有可以帮助解决此问题的功能。但是,这不是链接 C 对象的常见做法。 (也许它应该是。)

这种不匹配通常使用头文件来处理。压倒一切的常见做法是包含来自 header 的声明,而不是在其他源文件中手动输入它们。为此:

  • 创建 file1.h 并将 void p(int a); 放入其中。
  • 在 file1.c 中,插入 #include "file1.h"
  • 在 file2.c 中,插入 #include "file1.h" 并删除 p 的声明。

将file1.h包含在file1.c中的目的是让编译器同时看到file1.h中的声明和file1.c中的定义,如果不兼容就会报错。

那么,由于 file1.h 包含在 file2.c 中,我们确信编译 file2.c 时看到的声明与 file1.c 中的定义兼容。

关于c - 是否有 gcc 编译器选项可帮助捕获形式参数和实际参数类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56212992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com