C中的宏
在GUN C中,是支持可变数目的参数的。通常使用...来表示可变个数的参数:
void printf(const char* format, ....);
在define的预编译命令中,也支持这种可变参数的宏定义;
#define debug(...) printf(__VA_ARGS__)
使用保留名__VA_ARGS__来将参数传递给宏。
#define dgbmsg(fmt, ...) printf(fmt, ##__VA_ARGS__)
#define dbgmsg(fmt,...) printf("%s:%s:%05d", __FILE__,__FUNCTION__,__LINE__,##__VA_ARGS_)
C中的define ##起连接作用,相当于变量拼接的意思。
#表示变量替换的意思;
#define paster(n) printf("token" #n "=%0d", token##n);
paster(9)被翻译为 printf("token" "9" "= %0d", token9)
C中的main函数,可以使用两个默认的参数,
argc,argument count,表示传入main函数的参数个数;
argv,argument vector,表示传入main函数的参数序列或者指针,第一个参数arg[0]表示程序的名称,包含着程序的完整路径,
arg[0]表示传入的第一个真正的参数。
void main(int argc,char *argv[])
argv是指向指针的指针,也可以写成char **argv,
C语言中是不支持函数参数中有默认值的,函数中参数的默认值feature是在C++中才支持的。
C中调用matlab。
有两种方法,1)在c中import matlab的引擎,2)在c中使用matlab编译产生的dll文件,(linux下没法使用)
在C中调用matlab引擎,
首先,引入相应的头文件, #include "engine.h"
添加库文件,#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
定义引擎,Engine *ep;
打开引擎,if(!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n")
return EXIT_FAILURE
}
matlab变量格式创建,一般通过,mxCreateDoubleMatrix和memcpy函数。
使用engPutVariable来将数据传递给matlab引擎。
调用engEvalString执行命令,将matlab命令作为参数,利用matlab引擎进行计算。
数据清理,mxDestroyArray清除由mxCreateDoubleMatrix产生的变量,
最后使用engClose来关闭引擎。
extern和EXPORT_SYMBOL,作用类似,都是让被修饰的函数被其他文件中的函数调用;
1) EXPORT_SYMBOL,一般用在linux kernel中,通过宏可以将该函数的入口放在__ksymtab section中,
这样在runtime动态加载的时候,可以从ksymtab的section中解析出该函数;
2) extern,普通程序经常使用的外部函数类型声明,在编译的时候,被静态的链接调用。
而static修饰的静态函数,表示都是内部函数,不能被外部调用。与上边的两个用途相反。
C/C++中的assert函数原型定义在
#include <assert.h>
void assert( int expression );
用户只要在用户头文件中添加assert.h即可使用,用来判断expression的异常值,出错的情况下,向stderr发送出错信息。