【问题标题】:Faux getter/setter functions in C returning wrong valueC中的虚假getter/setter函数返回错误值
【发布时间】:2013-06-29 17:41:46
【问题描述】:

请帮忙?我在这里有点不知所措。

main.c:

int main(){
    double x = 12.345;
    set_alpha(x);
    double y = get_alpha();
    printf("%f\n", y);
    return 0;
}

block.c:

double alpha;
void set_alpha(double a){
    alpha = a;
    printf("%f\n", alpha);
}
double get_alpha(){
    return alpha;
}

运行gcc block.c main.c时,我得到了

12.345000
183898224.000000

,后一个数字随机变化。发生了什么?如何修复我的虚假 getter/setter 函数?

【问题讨论】:

  • 你看,如果你用gcc -Wall block.c main.c编译你会看到很多警告。

标签: c return-value getter-setter mutators


【解决方案1】:

如果您没有用于 get 和 set_alpha 的 原型,那么编译器将不知道它们的参数和返回值是什么。每个源文件都是独立编译的。如果原型未在main.c 中列出,则编译器必须猜测函数签名。它错误地猜测一切都是int,如int set_alpha(int a)int get_alpha()。糟糕!

修复:

void set_alpha(double a);
double get_alpha();

int main() {
    ...
}

最好的办法是创建一个单独的头文件block.h 并将原型放在那里。还要确保启用所有编译器的警告(例如gcc -Wall),这样你就不会再被这个问题所困扰了。

block.h

#ifndef BLOCK_H
#define BLOCK_H 

void set_alpha(double a);
double get_alpha();

#endif

main.c

#include "block.h"

int main() {
    ...
}

block.c

#include "block.h"

... 

【讨论】:

  • 我只是在调试它,看起来返回值没有被正确存储。不错的收获,+1
  • 天哪,这就是问题所在。我有一个block.h,但我是#include在我的block.c 文件中,而不是我的main.c。你能解释一下为什么这会有所不同吗?
  • 就像他提到的,gcc 看到 get_alpha 没有被声明,所以它假设它只是返回了一个 int (ooold 兼容性原因)。由于 ints 和 doubles 在 x86 上返回的方式(我假设您在 x86 平台上运行),返回可能是垃圾
  • 太棒了!非常感谢。
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2017-09-17
  • 2023-03-08
相关资源
最近更新 更多