精华内容
下载资源
问答
  • 最近有小伙伴找到说ascp的算法是用c语言编写的能不能做成接口的形式,首先对于C语言有一定的基础,之前也写过类似的跨语言的调用。 php调用动态库,有点难度,之前的方式是把dll注册为com组件,异常麻烦,使用的电脑...

    前言

    最近有小伙伴找到说ascp的算法是用c语言编写的能不能做成接口的形式,首先对于C语言有一定的基础,之前也写过类似的跨语言的调用。
    php调用动态库,有点难度,之前的方式是把dll注册为com组件,异常麻烦,使用的电脑上必须先注册Com组件才能使用。因此考虑使用phjp的exec调用exe,往里面传递参数。

    踩坑

    • 代码用纯C写的,而且部分代码是windows上特有的api,最开始也想过Linux下编译为可执行文件。因为跨平台的问题,语法都没有通过
    • 使用的visual studio 2013编译的,默认是C++的编译器,C++和C有些语法还不兼容。
    • 向生成的exe传递参数的时候,接收的时候类型转换异常。

    填坑

    • 定义宏 #define _CRT_SECURE_NO_WARNINGS 避免警告信息,有些函数例如C语言的sprintf,在C++中需要使用 sprintf_s还要加上刚才定义的宏,否则会一直报错
    • main函数接收参数
    int main(int argc, char **argv){
    ulong ts = strtoul(argv[1], NULL, 0);//原函数要求ts必须为无符号的long类型,需要使用类型转换,最开始直接强转的一直出错
    }
    
    • C语言传char *变量,数组要指定长度
      在这里插入图片描述
      在这里插入图片描述
    • C语言中没有自带字符串切割函数,手动YY了一个
    char* mysubstr(char* srcstr, int offset, int length) {
    	int total_length = strlen(srcstr);//首先获取srcstr的长度
    	//判断srcstr的长度减去需要截取的substr开始位置之后,剩下的长度
    	//是否大于指定的长度length,如果大于,就可以取长度为length的子串
    	//否则就把从开始位置剩下的字符串全部返回。
    	int real_length = ((total_length - offset) >= length ? length : (total_length - offset)) + 1;
    	char *tmp;
    	if (NULL == (tmp = (char*)malloc(real_length * sizeof(char)))) {
    		printf("Memory overflow . \n");
    		exit(0);
    	}
    	strncpy(tmp, srcstr + offset, real_length - 1);
    	tmp[real_length - 1] = '\0';
    	return tmp;
    }
    
    • 使用vs编译的运行总是缺少各种库,不知道是电脑问题还是编译的问题,安装一个vs的简洁版本就好了。

    php调用

    <?php
    if(!empty($_POST)){
        $ts=$_POST['ts'];
        $params=$_POST['params'];
        $device_id=$_POST['device_id'];
        $command="ascp.exe $ts  ".'"'.$params.'"'.' '. $device_id;
        $result=exec($command,$output,$return_var);
        if($return_var==0){
            $arr=explode(',',$output[0]);
            exit(json_encode(['as'=>substr($arr[0],0,22),'cp'=>substr($arr[0],22),'mas'=>$arr[1]]));
        }else{
            exit(json_encode([]));
        }
    }else{
        exit(json_encode(['msg'=>'请使用post请求']));
    }
    

    效果

    在这里插入图片描述

    展开全文
  • 大家都知道,C语言本身没有...在动态类型的语言里面,往往有typeof这种语法,来获取变量的数据类型,比如JavaScript当中,typeof以字符串型式返回了这个变量的数据类型,借由这种特性,往往可以根据传入参数的类型不同

    大家都知道,C语言本身没有多态的概念,函数没有重载的概念。然而随着C语言编写的软件逐渐庞大,越来越多地需要引入一些其他语言中的特性,来帮助更高效地进行开发,Linux kernel是一个典型例子。

    在动态类型的语言里面,往往有typeof这种语法,来获取变量的数据类型,比如JavaScript当中,typeof以字符串型式返回了这个变量的数据类型,借由这种特性,往往可以根据传入参数的类型不同,产生不同的行为。

    GCC提供的typeof,实际上是在预编译时处理的,最后实际转化为数据类型被编译器处理。用法上也和上述语言不太一样。

    基本用法是这样的:

    ?
    1
    2
    3
    int a;
    typeof(a) b; //这等同于int b;
    typeof(&a) c; //这等同于int* c;

    那么在内核中这种特性是怎样使用的呢?

     

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /*
     * Check at compile time that something is of a particular type.
     * Always evaluates to 1 so you may use it easily in comparisons.
     */
    #define typecheck(type,x) \
    ({  type __dummy; \
        typeof(x) __dummy2; \
        (void)(&__dummy == &__dummy2); \
        1; \
    })
     
    /*
     * Check at compile time that 'function' is a certain type, or is a pointer
     * to that type (needs to use typedef for the function type.)
     */
    #define typecheck_fn(type,function) \
    ({  typeof(type) __tmp = function; \
        (void)__tmp; \
    })

    这两段代码来自于include/linux/typecheck.h,用于数据类型检查。

    宏typecheck用于检查x是否是type类型,如果不是,那么编译器会抛出一个warning(warning: comparison of distinct pointer types lacks a cast);而typecheck_fn则用于检查函数function是否是type类型,不一致则抛出warning(warning: initialization from incompatible pointer type)。

    原理很简单,对于typecheck,只有当x的类型与value一致,&__dummy == &__dummy2的比较才不会因为类型不匹配而抛出warning,详情可以参考C语言对于指针操作的标准规定。对于typecheck_fn,当然也只有function的返回值和参数表与type描述一致,才不会因为类型不匹配而抛出warning。

    到这里有人可能会有一个疑问,内核代码里执行类型检查会不会降低效率?答案是不会的,因为实际上,这些为类型检查而声明的临时变量,实际上在上下文中都没有使用,并且还特别地强制类型转换为void防止任何由这些临时变量产生的结果被使用的情况,因此在编译器优化时,就将这些无用的代码删除了。

    然后kernel中还定义了使用另一种类型检查策略的获取最大最小值的宏。

     

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /*
     * ..and if you can't take the strict
     * types, you can specify one yourself.
     *
     * Or not use min/max/clamp at all, of course.
     */
    #define min_t(type, x, y) ({            \
        type __min1 = (x);          \
        type __min2 = (y);          \
        __min1 < __min2 ? __min1: __min2; })
     
    #define max_t(type, x, y) ({            \
        type __max1 = (x);          \
        type __max2 = (y);          \
        __max1 > __max2 ? __max1: __max2; })

    这个例子里面不要求x和y是严格等于type类型,只要x和y能够安全地完成隐式类型转换为type就可以安全通过编译,否则会抛出warning。

    另外一个非常经典的例子就是交换变量。

     

    ?
    1
    2
    3
    4
    5
    /*
     * swap - swap value of @a and @b
     */
    #define swap(a, b) \
        do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)

    试想如果没有typeof,要怎么在C语言中实现这种类似C++模板的特性呢?

    最后不得不提的就是container_of宏,在kernel中也被广泛使用。

     

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * container_of - cast a member of a structure out to the containing structure
     * @ptr:    the pointer to the member.
     * @type:   the type of the container struct this is embedded in.
     * @member: the name of the member within the struct.
     *
     */
    #define container_of(ptr, type, member) ({          \
        const typeof( ((type *)0)->member ) *__mptr = (ptr); \
        (type *)( (char *)__mptr - offsetof(type,member) );})

    比如内核的task_struct数据结构中有一个member是sched_entity类型的se,这个member常常被调度器使用来决定进程的调度顺序,那么如果要根据这个se来获取包含它的task_struct,就可以使用container_of(p, task_struct, se)来实现(假设p是指向这个sched_entity的指针)。原理是先产生一个指针指向member,然后将这个指针减去member在这个struct中的偏移量,指针自然就指向了包含该member的对象了(这个地方用到了offsetof,含义一看便知,我就不再细说了)。

    希望大家对typeof的使用有了一个更好的理解,欢迎评论!

    展开全文
  • 大家都知道,C语言本身...在动态类型的语言里面,往往有typeof这种语法,来获取变量的数据类型,比如JavaScript当中,typeof以字符串型式返回了这个变量的数据类型,借由这种特性,往往可以根据传入参数的类型不同,产

    大家都知道,C语言本身没有多态的概念,函数没有重载的概念。然而随着C语言编写的软件逐渐庞大,越来越多地需要引入一些其他语言中的特性,来帮助更高效地进行开发,Linux kernel是一个典型例子。

    在动态类型的语言里面,往往有typeof这种语法,来获取变量的数据类型,比如JavaScript当中,typeof以字符串型式返回了这个变量的数据类型,借由这种特性,往往可以根据传入参数的类型不同,产生不同的行为。

    GCC提供的typeof,实际上是在预编译时处理的,最后实际转化为数据类型被编译器处理。用法上也和上述语言不太一样。

    基本用法是这样的:

    int a;
    typeof(a) b; //这等同于int b;
    typeof(&a) c; //这等同于int* c;

    那么在内核中这种特性是怎样使用的呢?

     

    /*
     * Check at compile time that something is of a particular type.
     * Always evaluates to 1 so you may use it easily in comparisons.
     */
    #define typecheck(type,x) \
    ({	type __dummy; \
      typeof(x) __dummy2; \
      (void)(&__dummy == &__dummy2); \
      1; \
    })
    
    /*
     * Check at compile time that 'function' is a certain type, or is a pointer
     * to that type (needs to use typedef for the function type.)
     */
    #define typecheck_fn(type,function) \
    ({	typeof(type) __tmp = function; \
      (void)__tmp; \
    })

    这两段代码来自于include/linux/typecheck.h,用于数据类型检查。

    宏typecheck用于检查x是否是type类型,如果不是,那么编译器会抛出一个warning(warning: comparison of distinct pointer types lacks a cast);而typecheck_fn则用于检查函数function是否是type类型,不一致则抛出warning(warning: initialization from incompatible pointer type)。

    原理很简单,对于typecheck,只有当x的类型与value一致,&__dummy == &__dummy2的比较才不会因为类型不匹配而抛出warning,详情可以参考C语言对于指针操作的标准规定。对于typecheck_fn,当然也只有function的返回值和参数表与type描述一致,才不会因为类型不匹配而抛出warning。

    到这里有人可能会有一个疑问,内核代码里执行类型检查会不会降低效率?答案是不会的,因为实际上,这些为类型检查而声明的临时变量,实际上在上下文中都没有使用,并且还特别地强制类型转换为void防止任何由这些临时变量产生的结果被使用的情况,因此在编译器优化时,就将这些无用的代码删除了。

    然后kernel中还定义了使用另一种类型检查策略的获取最大最小值的宏。

     

    /*
     * ..and if you can't take the strict
     * types, you can specify one yourself.
     *
     * Or not use min/max/clamp at all, of course.
     */
    #define min_t(type, x, y) ({			\
      type __min1 = (x);			\
      type __min2 = (y);			\
      __min1 < __min2 ? __min1: __min2; })
    
    #define max_t(type, x, y) ({			\
      type __max1 = (x);			\
      type __max2 = (y);			\
      __max1 > __max2 ? __max1: __max2; })

    这个例子里面不要求x和y是严格等于type类型,只要x和y能够安全地完成隐式类型转换为type就可以安全通过编译,否则会抛出warning。

    另外一个非常经典的例子就是交换变量。

     

    /*
     * swap - swap value of @a and @b
     */
    #define swap(a, b) \
      do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)

    试想如果没有typeof,要怎么在C语言中实现这种类似C++模板的特性呢?

    最后不得不提的就是container_of宏,在kernel中也被广泛使用。

     

    /**
     * container_of - cast a member of a structure out to the containing structure
     * @ptr:	the pointer to the member.
     * @type:	the type of the container struct this is embedded in.
     * @member:	the name of the member within the struct.
     *
     */
    #define container_of(ptr, type, member) ({			\
      const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
      (type *)( (char *)__mptr - offsetof(type,member) );})

    比如内核的task_struct数据结构中有一个member是sched_entity类型的se,这个member常常被调度器使用来决定进程的调度顺序,那么如果要根据这个se来获取包含它的task_struct,就可以使用container_of(p, task_struct, se)来实现(假设p是指向这个sched_entity的指针)。原理是先产生一个指针指向member,然后将这个指针减去member在这个struct中的偏移量,指针自然就指向了包含该member的对象了(这个地方用到了offsetof,含义一看便知,我就不再细说了)。

    希望大家对typeof的使用有了一个更好的理解,欢迎评论

    展开全文
  • c语言经典案例

    2014-10-30 08:06:57
    实例228 用不带参数的宏定义求 平行四边形面积 342 实例229 使用宏定义实现数组值 的互换 343 实例230 编写头文件包含圆面积的 计算公式 344 实例231 利用宏定义求偶数和 345 实例232 利用文件包含设计输出模式 346 ...
  • C语言时间函数介绍

    千次阅读 多人点赞 2019-01-16 15:31:35
    C语言中有一个可以获取当地时间的函数,刚刚接触,写一点使用方法。 使用时间函数要预编译#include&amp;amp;lt;time.h&amp;amp;gt;头文件。 操作时间的函数具体有下面几个。 time_t time(time_t *t);:...

    C语言中有一个可以获取当地时间的函数,刚刚接触,写一点使用方法。

    使用时间函数要预编译#include<time.h>头文件。
    操作时间的函数具体有下面几个。

    time_t time(time_t *t);:返回当前距1970年1月1号的秒 参数:一般填充NULL
    struct tm *localtime(const time_t *timep);//将秒数转换为本地详细时间描述
     char *ctime(const time_t *timep);//将秒数转换为本地时间字符串
     struct tm *gmtime(const time_t *timep);//将秒数转换为国际标准时间详细描述
     char *asctime(const struct tm *tm);//将时间的详细描述转换为字符串
    

    这个是C语言中存放时间结构体。

    struct tm {
                      int tm_sec;         /* 秒:取值区间为[0,59]  */
                      int tm_min;         /*分:取值区间为[0,59]*/
                      int tm_hour;        /* 时:取值区间为[0,23] */
                      int tm_mday;        /* 一个月中的日期:取值区间为[1,31]*/
                      int tm_mon;         /* 月份(从一月开始, 0 代表一月) :取值区间为[0,11] */
                      int tm_year;        /* 年份:其值等于实际年份加上 1900 */
                      int tm_wday;        /*  星期:取值区间为[0,6],其中 0 代表星期天,1 代表星期一,以此类推 */
                      int tm_yday;        /*从每年的 1 月 1 日开始的天数:取值区间为[0,365],其中            0 代表 1 月 1 日,1 代表 1 月 2 日,以此类推*/
                      int tm_isdst;       /* 夏令时 */
                  };
    
    

    计算时间是把从1970年开始到现在的秒数,通过计算得出现在的年月日时分秒。

    因此计算时间首先要获取秒数,然后处理输出。

    time_t tm;//定义一个接收秒数的变量
    

    time_t //是一个重定义过的typedef unsigned long time_t;

    下面每个处理秒数的函数都给一个实例:

    获取秒
    获取秒数的方法1

    #include<stdio.h>
    #include<time.h>
    int main()
    {
     time_t tm;//定义一个接收秒数的变量
     tm = time(NULL);//time返回秒数
     printf("%ld\n", tm);//打印秒数
     return 0;
    }
    

    获取秒数的方法2

    #include<stdio.h>
    #include<time.h>
    int main()
    {	
     time_t tm;//定义一个接收秒数的变量
     time(&tm);//tm是秒数
     printf("%ld\n", tm);
     return 0;
    }
    

    有两种方法不难看出time函数是用来获取秒的
    time_t time(time_t *t);:返回当前距1970年1月1号的秒

    处理秒的函数

    char *ctime(const time_t *timep); 将秒数转换为本地时间字符串
    #include<stdio.h> 
    #include<time.h> 
    int main()
    {
     char *day;
     time_t tm = 0;
     time(&tm);//获取秒
     day = ctime(&tm);//将秒转换为本地时间字符串,注意传参是地址传递
     //printf("%s", ctime(&tm));
     printf("%s", day);//打印本地时间。会自动换行
     return 0;
    }
    
    struct tm *localtime(const time_t *timep); 将秒数转换为本地详细时间描述
    #include<stdio.h>
    #include<time.h>
    int main()
    {
     struct tm *day;//定义一个接收本地详细时间的结构体变量,在上面有这个结构的详细说明
     time_t tm = 0;
     time(&tm);
     day = localtime(&tm);//将秒数转换为本地详细时间描述
     printf("%d year %d month %d day %d hour %d min %d sec\n",1900+day->tm_year,1+day->tm_mon,day->tm_mday,day->tm_hour,day->tm_min,day->tm_sec);//将时间通过访问结构体成员变量的方法逐个输出,注意年份是从1900年开始,要+1900,月份也要加1
     return 0;
    }
    
    struct tm *gmtime(const time_t *timep); 将秒数转换为国际标准时间详细描述
    #include<stdio.h>
    #include<time.h>
    int main()
    {
     struct tm *day;
     time_t tm = 0;
     time(&tm);
     day = gmtime(&tm);
     printf("%d year %d month %d day %d hour %d min %d sec\n",1900+day->tm_year,1+day->tm_mon,day->tm_mday,day->tm_hour,day->tm_min,day->tm_sec);
     return 0;
    }//和localtime使用方法一样
    
    char *asctime(const struct tm *tm); 将时间的详细描述转换为字符串
    #include<stdio.h>
    #include<time.h>
    int main()
    {
     struct tm *day;
     char *day1;
     time_t tm = 0;
     time(&tm);
     day = gmtime(&tm);//将秒数转换为国际标准**时间详细描述**
     printf("%d year %d month %d day %d hour %d min %d sec\n",1900+day->tm_year,1+day->tm_mon,day->tm_mday,day->tm_hour,day->tm_min,day->tm_sec);
     day1 = asctime(day);//将**时间的详细描述**转换为字符串
     printf("%s",day1);//输出字符串
     //printf("%s",asctime(day));
     return 0;
    }
    
    展开全文
  • c语言总结二

    2019-09-16 16:17:00
     register修饰目的:申请将变量存放到寄存器中(早期的C编译程序不会把变量保存在寄存器中,当时register修饰符是一种很有价值的补充。现在基本上会忽略register修饰符)  register变量可能不存放在内存中,所以不...
  • C语言学习第十二天

    2020-11-13 22:33:02
    get:获取 info:信息 回顾: 1.Makefile 制定编译规则,让gcc根据编译规则进行编译程序 语法: 目标:依赖1 依赖2 …依赖N (TAB键)编译命令1 … (TAB键)编译命令N make命令使用 工作流程 小技巧: %.o:%.c gcc -c -o ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小的参数数组? 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只...
  • C语言的科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    1.5 程序设计语言和编译 7 1.6 编程错误和调试 9 1.7 软件维护 10 1.8 软件工程的重要性 11 1.9 关于c程序设计语言的一些思考 11 小结 12 复习题 12 第一部分 c语言程序设计基础 .第2章 通过例子学习 16 ...
  • 第11章 C语言程序的编译上下文 /263 11.1 C语言程序中的作用域和名字空间 263 11.1.1 文件作用域 264 11.1.2 函数作用域 265 11.1.3 函数原型作用域 266 11.1.4 语句块作用域 267 11.1.5 标识符的重定义与作用...
  • 参数errcode是来自函数regcomp()或regexec()的错误代码, 而参数preg则是由函数regcomp()得到的编译结果, 在errbuf缓冲区中填入格式化后的错误信息, 同时返回错误信息的长度。 /取子串的函数/ /编译正则表达式/ ...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  • 1. 获取安装包。 wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz 2. 解压。 tar -xzvf openssl-1.1.1c.tar.gz 3. 配置。 ./Configure --help # 配置参数选项 --openssldir=OPENSSLDIR #配置文件目录,...
  • 至今我们都是通过声明的方式获取内存空间的,这样程序编译完后就无法对数据结构的存储空间进行伸缩了,就无法设计需要伸缩的数据结构(如:链表),可能有人会说那一开始就声明一个很大的数组不就好了吗,那样会造成...
  • 1.1.2 编译 2 1.1.3 链接 2 1.1.4 执行 3 1.2 创建第一个程序 4 1.3 编辑第一个程序 4 1.4 处理错误 5 1.5 剖析一个简单的程序 6 1.5.1 注释 6 1.5.2 预处理指令 7 1.5.3 定义main()函数 7 1.5.4 关键字 ...
  • 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小的参数数组? 13 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 ...
  • #include #define LED P1^1 //用符号 LED 代替 P1_1 用符号 //用符号 KEY_ON 代替 P1_6 用符号 //用符号 KEY_OFF 代替 P1_7 用符号 //单片机复位后的执行入口,void 表示空,无输入参数,无返回值 #define KEY_ON ...
  • //第一个参数是要匹配的字符串,第二个参数是匹配的规则,返回匹配的个数 int reptile_regex(char* buf) { const char* pattern="<TITLE>.*<\\/TITLE>"; int cflags= REG_EXTENDED; const size_t nmatch=10;//结构体...
  • 市面上有很多介绍C语言的书,但这是第一本将C语言以简洁而实用的方式介绍给读者的书籍。 用C语言进行编程不仅仅是在程序中使用正确的句法,编程的风格以及程序的调试在编写程序的过程中也占有相当大的篇幅,从而有助...
  • 当我们需要使用外部的库(比如XML处理、正则等),除了编译的时候连接该哭外,也可以打开.so的库获取函数地址,传入参数,来调用外部库的函数。 后一种方式可以在程序中用一个统一的结构体来管理。 比如动态库a中...
  • 程序和编译 2 注释 3 固定代码 4 printf函数:格式化输出函数 4 语句 5 计算并显示整数的差 5 格式化字符串和转换说明 6 符号的称呼 8 无格式化输出 8 字符串常量 10 转义字符 10 1-2 变量 11 变量和...
  • 此Xcode项目生成一个名为“ objk”的命令行工具,该工具将指向“ .ok”源文件的路径作为其唯一参数,并将其编译为C源代码。 执照 Copyright 2014 by Uli Kusterer. This software is provided 'as-is', without any...
  • 但是,用静态类型的程序语言,如C语言等书写的代码,一经编译和链接,其处理逻辑即不可更改。因此,在无法获取源代码或者重新编译和重新启动代价较高的应用中,对软件进行动态性能分析非常困难。本文将介绍一种在...
  • Apache程序包编译安装的过程A、安装前准备工作: 1、Apache 最新版本源代码的获取地址如下,下载对应压缩格式源码。 下载地址1 2、核实系统环境。如下图查看。 B、C语言源代码在Centos7.4下编译安装三大步骤: 1...
  • 命令行参数在C中,获取用户输入的命令行参数是很方便的。程序的主函数会接受一个argv参数。有许多高级的库函数都会用到argv结构,所以了解此结构对一个C程序员来说将是很有用的。请录入并编译下面的程序:#include ...
  • matlab非参数代码日内现货波动率的非参数估计:解开瞬时趋势和季节性 概述 这是 Thibault Vatter、Hau-Tieng Wu、Valerie Chavez-Demoulin 和 Bin Yu 论文随附的代码。 代码是用 ; 它提供了清理日内外汇价格的功能,...
  • ① Java语言 与 C语言如何交流 , Android 中 JNI 和 正常...④ JNI中Java语言与C语言参数传递, 九种原生数据类型 在 C Java JNI 中的类型转换 , NDK中打印日志, JNI中数组相关操作(获取数组长度,获取数组中的元素);
  • msvcrt.dll

    2020-03-31 09:58:20
    其中提供了printf,malloc,strcpy等C语言库函数的具体运行实现,并且为使用C/C++(Vc)编译的程序提供了初始化(如获取命令行参数)以及退出等功能

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 143
精华内容 57
关键字:

c语言获取编译参数

c语言 订阅