关于编译
C++变量初始化时.初值可以是一个常量,也可以是一个有确定值的表达式.
如下:
float c=sin(2);
那么,编译时,是将标准函数库中的正弦函数定义加入到.obj文件呢?还是直接得到一个值付给C而已呢?
请帮助一下.谢谢.
------解决方案--------------------是将标准函数库中的正弦函数定义加入到.obj文件
------解决方案--------------------应该不是立即得出值的,原因很简单:把编译和连接是分步进行的,假设编译的时候机器上还没有sin的目标文件,如何求得sin()的值呢?再想想交叉编译。。。。
------解决方案--------------------理论上,编译时能解决的问题就在编译时解决,把上述问题变换一下来理解:int i=2+3;
实际上,就我所知目前还没有哪个编译器能在编译时解决math.h中涉及的函数,这没有必要。
所以,float c=sin(2)是在运行时求值的,即编译源文件时在.obj中产生一个未解决的外部符号_sin,连接时将连接到相关数学库。
可以从两个方面来求证:
1. 一个.c中除了上述语句外不使用任何其他math.h中的符号,但没有#include <math.h> ,看是否能编译通过;
2. 大多数编译器(如VC)都能产生asm代码(通过工程选项设置),查看上述语句产生的asm代码就能明确是否调用的sin函数。