gpt4 book ai didi

c - 当链接源中的函数定义与 header 中的函数原型(prototype)不同时,gcc 不会发出警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:30 25 4
gpt4 key购买 nike

我的部分代码有问题,经过一些迭代后,它似乎将 NaN 读取为结构的 double 的值。我想我发现了错误,但我仍然想知道为什么 gcc(带有 busybox 的嵌入式 Linux 上的版本 3.2.3)没有警告我。以下是代码的重要部分:

通过 USB 获取数据的函数的 c 文件及其头文件:

// usb_control.h
typedef struct{
double mean;
short *values;
} DATA_POINTS;

typedef struct{
int size;
DATA_POINTS *channel1;
//....7 more channels
} DATA_STRUCT;

DATA_STRUCT *create_data_struct(int N); // N values per channel
int free_data_struct(DATA_STRUCT *data);

int aqcu_data(DATA_STRUCT *data, int N);

带有辅助函数(数学、位移等...)的 c 和头文件:

// helper.h
int mean(DATA_STRUCT *data);

// helper.c (this is where the error is obviously)
double mean(DATA_STRUCT *data)
{
// sum in for loop
data->channel1->mean = sum/data->N;
// ...7 more channels
// a printf here displayed the mean values corretly
}

主文件

// main.c
#include "helper.h"
#include "usb_control.h"

// Allocate space for data struct
DATA_STRUCT *data = create_data_struct(N);

// get data for different delays
for (delay = 0; delay < 500; delay += pw){
acqu_data(data, N);
mean(data);
printf("%.2f",data->channel1->mean); // done for all 8 channels
// printf of the mean values first is correct. Than after 5 iterations
// it is always NaN for channel1. The other channels are displayed correctly;
}

没有段错误或任何其他错误行为,只有主文件中 channel1 的 NaN。

找到错误后,这并不容易,修复当然很容易。 mean(){} 的返回类型在定义中是错误的。而不是 double mean() 它必须是 int mean() 正如原型(prototype)定义的那样。当所有函数都放入一个文件中时,gcc 警告我函数 mean() 有一个重新定义。但是当我分别编译每个 c 文件并在之后链接它们时,gcc 似乎错过了这一点。

所以我的问题是。为什么我没有收到任何警告,即使没有使用 gcc -Wall?或者是否还有另一个隐藏的错误现在不会引起问题?

问候,基督徒

最佳答案

当每个 .c 文件被单独编译时,编译器知道的唯一信息是你提供的函数原型(prototype)。

因为每个文件都是单独编译的,所以 main.c 的编译进程无法知道 helper.cmean 的定义> 是错误的。

.c文件编译后,签名会被剥离,所以链接器也无法知道mean是错误的。

一个简单的修复方法是始终在实现.c 文件中包含接口(interface).h 文件

// in helper.c:
#include "helper.h"
double mean(DATA_STRUCT *data);

然后 helper.c 的编译进程会注意到不一致的类型并警告你。

关于c - 当链接源中的函数定义与 header 中的函数原型(prototype)不同时,gcc 不会发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958036/

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