c - 在另一个 .c 文件上声明函数使浮点乘法始终为 0
问题描述
如果我在 main 中定义函数,一切正常。但是如果我在另一个 c 文件中定义该函数,就会发生这个奇怪的浮点乘法问题:它总是给出 0。
示例 1/main.c:
int multiply_by_2(float scalar) {
printf("result: %f\n", scalar*2);
}
int main()
{
multiply_by_2(3);
}
示例 1/CMakeLists.txt
cmake_minimum_required(VERSION 2.6.0)
project(example C)
add_executable(example main.c)
输出:
result: 6.000000
示例 2/main.c:
int main()
{
multiply_by_2(3);
}
示例 2/ac:
int multiply_by_2(float scalar) {
printf("result: %f\n", scalar*2);
}
示例 2/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
返回函数,它没有return
任何整数。这会触发未定义的行为(一旦您在其他地方调用该multiply_by_2
函数)。害怕,可能会发生非常糟糕的事情(即使在该multiply_by_2
函数之外或其调用者之外)。
下一次,使用所有警告和调试信息进行编译,如果 gcc -Wall -Wextra -g
使用GCC的话。改进您的代码以获得没有警告。
另请阅读如何调试小程序。
如果您使用浮点数,请非常小心。它们难以理解并且行为违反直觉(例如,加法不是关联的)。首先阅读http://floating-point-gui.de/。
如果您有多个 翻译单元(例如源文件,如a.c
和main.c
),您实际上应该至少在每个文件中都有一些通用的头文件。在第一个近似值上,你的头文件应该声明你所有的 [global] 类型和函数。而且您需要配置您的构建自动化工具(例如编写您的)以考虑此类依赖关系:应该以某种方式提及您的头文件。#include
*.c
Makefile
推荐阅读
- cassandra - Cassandra 中的自定义分区器
- reactjs - 如何默认修改本地url
- php - 带有 iCal Parser 的 PHP 函数减慢页面加载时间
- javascript - 在 mxgraph 中创建反向 mxHierarchical 布局
- python - 如何在python中做一个日期和时间列表
- html - 使用 CSS 样式规则创建一个容器元素,以便它围绕其浮动内容展开
- excel - 用户表单以看似相反的顺序循环
- laravel - 由于使用 laravel 的未知错误而无法上传文件
- javascript - 当地图设置了“限制”选项时,map.fitBounds 的工作很奇怪
- java - 如何在 SAP 中使用 BAPI_QUALNOT_CREATE 创建 LONGTEXTS?