The best input is OUTPUT.

2016-02-18
动力学模拟程序更名为Kynetix

决定把催化动力学模拟程序名称更改为Kynetix
项目GitHub地址: https://github.com/PytLab/Kynetix

Read More

2016-02-17
C++各大有名科学计算库

在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。

Read More

2016-02-17
关于翻译单元(编译单元)

我的理解,翻译单元(translation unit)就是一个源代码文件,或者说是经过预处理器宏展开后得到的源码文件。在别人的博客中看到过

translation unit(翻译单元)也可称为compilation unit(编译单元),translation unit是C预处理后的输出,即一个源文件经过预处理后.
经过translation unit后产生一个目标文件(比如.c通过编译产生.o文件)

我个人的理解,一个翻译单元,至少是能够用编译器单独编译成.o文件的,因此有时候把函数定义或者类成员函数的定义放在单独的代码文件中时候,时候包含头文件与否要看是否能够单独将文件编译通过。例如类成员方法的文件中就应该要包含类定义的头文件,不然单独编译这些成员函数的时候,所操作的成员变量以及类名称都没告诉编译器,怎么让编译器给你编译?
但是有些时候例如使用关键字extern声明的引用声明,是可以进行编译的,我的理解就是编译器看到类似声明的变量或者函数的时候,应该会认为这个变量虽然在本单元中没有提供,但是链接器会把这个变量从其他的地方找到,因此就不报错了。估计调用在其他地方定义的函数也是类似的原因,反正有函数原型了,能不能执行函数就看连接器的了,我编译器就不管了(纯属个人意淫。

Read More

2016-02-16
函数定义可无需提供原型单独编译

在多文件程序中一般我们会把结构相关的函数定义放在一个文件中以供调用,但是之前我一直不知道在这个文件中还需不需要这些函数的原型,正好在写练习的时候碰到了,就把原型删掉单独编译函数文件,编译通过。
这就说明了函数定义可以无需提供原型单独编译,原型仅是提供给调用函数的地方让编译器进行检查调用是否合法的。

Read More

2016-02-14
变量的静态初始化和动态初始化

零初始化和常量表达式初始化统称为静态初始化,这意味着编译器处理文件时就初始化了变量。
动态初始化意味着变量将在编译后初始化(先分配内存空间)。

使用常量表达式初始化变量,编译器根据文件内容对常量表达式进行简单的计算。但是编译器有没有那么的智能,它也只是能进行简单的计算,如果没有足够的信息,变量将被动态初始化。
但是,有一个比较特别的常量表达式,它没有使用字面常量。他就是sizeof运算符。
以下初始化表达式都是静态初始化

1
2
3
4
int x;                 // 零初始化
int y = 5; // 常量表达式初始化
long z = 13 * 13; // 常量表达式初始化
int e = sizeof(long); // 常量表达式初始化

Read More

2016-02-13
关于C/C++的单定义规则

我们知道一般头文件包含的内容有:

  • 函数原型
  • 使用#defineconst(仅对于C++而言)定义的符号常量
  • 结构声明
  • 类声明
  • 模板声明
  • 内联函数

正常在头文件中的内容是不进行内存分配的,例如若是变量则同一个变量会被重复定义声明,同理函数定义也是。所以也不能使用#include来包含源代码文件,也会导致多重声明

单定义规则(One Definition Rule, ODR)

单定义规则(One Definition Rule, ODR):变量只能有一次定义。
Read More