由于本人该学期开设的高性能计算实验课程主要使用c/c++编程,于是今天重新写了c,可以说非常难受了(中了FORTRAN95de 毒),说一下今天的问题:
a.为了重新熟悉c,写了个串行的矩阵乘法(两个矩阵乘法,矩阵无特殊性,暴力乘);
b.main.cpp matrix_multi.h matrix_multi.c三个文件:测试main,函数实现在matrix_multi.c
1)gcc编译的问题
gcc编译器的流程:
第一步,编译器对.c文件进行预处理:检查#include中<>和“”的文件位置,编译器首先去c库中寻找,然后在当前目录中寻找;
生成的预处理文件main.i(可以用vim查看,里面列出了库函数的调用路径)
gcc -E main.c -o main.i
第二步,编译器对.i文件进行词法分析(编译原理),检查语法错误,编译生成汇编语言的代码文件main.s;
gcc -S main.i -o main.s
第三步,编译器将汇编代码转为二进制代码文件main.o;
gcc -c main.s -o main.o
第四步,链接器将二进制文件转为可执行文件main(静态链接库),为静态变量分配实际的系统内存。
gcc main.o -o main
一步到位:
gcc main.c -o main
编译多个文件:
matrix_multi.c中实现了矩阵乘法的函数,matrix_multi.h声明其函数名。
编译时,无需编译matrix_multi.h文件(gcc预处理阶段会直接在当前目录寻找):
gcc main.c matrix_multi.c -o main
2)define宏防止头文件重复:防止.h文件被重复引用(导致函数、变量重命名)
#ifndef _MATRIX_MULTI.H
#define _MATRIX_MULTI.H
//code: variable and function declaration
#endif