如果我在 main 中定义函数,一切正常。但是,如果我在另一个 c 文件中定义该函数,就会发生这个奇怪的浮点乘法问题:它总是给出 0。
example1/main.c:
int multiply_by_2(float scalar) {
printf("result: %f\n", scalar*2);
}
int main()
{
multiply_by_2(3);
}
example1/CMakeLists.txt
cmake_minimum_required(VERSION 2.6.0)
project(example C)
add_executable(example main.c)
输出:
result: 6.000000
example2/main.c:
int main()
{
multiply_by_2(3);
}
示例 2/a.c:
int multiply_by_2(float scalar) {
printf("result: %f\n", scalar*2);
}
example2/CMakeLists.txt:
cmake_minimum_required(VERSION 2.6.0)
project(example C)
add_executable(example main.c a.c)
输出:
result: 0.000000
最佳答案
int multiply_by_2(float scalar) {
printf("result: %f\n", scalar*2);
}
您有一个int
返回函数,它不返回
任何整数。这会触发 undefined behavior (一旦您在别处调用该 multiply_by_2
函数)。是 scared ,可能会发生非常糟糕的事情(甚至在 multiply_by_2
函数的 之外或其调用者之外)。
下次,使用所有警告和调试信息进行编译,所以 with gcc -Wall -Wextra -g
如果使用 GCC .改进您的代码以消除警告。
另请阅读 How to debug small programs .
如果您使用 floating point数字,要非常小心。它们很难理解并且行为违反直觉(例如加法不是结合的)。阅读http://floating-point-gui.de/首先。
如果你有几个 translation units (例如 a.c
和 main.c
等源文件)您实际上至少应该有一些通用的 header file和 #include
它在每个 *.c
文件中。初步估计,您的头文件应该声明所有 [global] 类型和函数。你需要配置你的 build automation工具(例如写你的 Makefile
)来考虑这样的 dependencies : 应该以某种方式提及您的头文件。
阅读更多有关 C 编程的信息。另见一些 C reference地点。阅读您正在使用的每个功能的文档(例如 printf )
通过研究现有 small 的源代码,你会学到很多东西 free software程序(例如 github、gitlab、Linux 发行版等)。
关于c - 在另一个 .c 文件上声明函数使浮点乘法始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55073435/