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发送出错信息。

posted @ 2017-11-28 15:03  _9_8  阅读(347)  评论(0编辑  收藏  举报