c/c++

Android Studio 使用NDK编译jni

落爺英雄遲暮 提交于 2019-11-30 10:50:52
试用了Android Studio一段时间,发现这东西不支持C/C++,而且创建工程也只能创建Android的工程.这可苦恼死我了.... 网上找了找,大多人都说是AndroidStudio和Eclipse之间来回切换..这不悲剧吗? 在AndroidStuido的Setting-Plugins中发现有C/C++的插件,安装后发现自己能力有限,不会玩这东西.. 每次要打开C文件点击Tools-Cpp Support-Do compile for selected c/c++ file to compile.才能编译 编译过程发现有这样一个文件"C:\Users\Administrator.Mutour-pc\.AndroidStudioPreview\system\tmp\gcc4139693535478647149.bat" 打开 发现很简单的几句话: set PATH=$PATH$;c:\cygwin\bin gcc 很显然,编译失败......... 想到Eclipse中编译NDK时的设置 " http://my.oschina.net/mutour/blog/98535 " 修改该文件如下:(其实跟命令行编译一样...) set PATH=$PATH$;E:\cygwin\bin bash.exe --login -c "cd $(cygpath -u 'E:

C++中extern “C”含义深层探索

╄→гoц情女王★ 提交于 2019-11-29 13:26:20
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的: 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。 _foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C+

C Primer Plus 第4章 字符串和格式化输入/输出 编程练习及答案

跟風遠走 提交于 2019-11-29 03:46:19
1、编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”格式输出。 #include int main() { char fname[40],lname[40]; printf("Enter your firstname.\n"); scanf("%s",fname); //注意lname与fname是数组,在scanf()时无需加&符号。 printf("Enter your lastname.\n); scanf("%s",lname); printf("Welcome,%s, %s\n",lname,fname); return 0; } 2、编写一个程序,要求输入名字,并执行以下操作: a.把名字引在双引号中打印出来; b.在宽度为20个字符的字段内打印名字,并且整个字段引在引号内; c. 在宽度为20个字符的字段的左端打印名字,并且整个字段引在引号内; d.在比名字宽3个字符的字段内打印它。 #include #include int main() { char name[40]; int width; printf("Enter you name.\n"); scanf("%s",name); printf("A:\"%s\".\n",name); printf("B:\"%20s\".\n",name); printf("C:\"%-20s\".\n",name);

C/C++中的static和extern关键字

╄→尐↘猪︶ㄣ 提交于 2019-11-28 16:01:24
一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。 (1)修饰局部变量 一般情况下,对于局部变量是存放在 栈区 的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在 静态数据区 ,其生命周期一直持续到整个程序执行结束。但是在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期以及存储空间发生了变化, 但是其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。 在用static修饰局部变量后, 该变量只在初次运行时进行初始化工作,且只进行一次 。 如: #include<stdio.h> void fun() { static int a=1; a++; printf("%d\n",a); } int main(void) { fun(); fun(); return 0; } 程序执行结果为: 2 3 说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自增运算,所以得到的结果为3. 对于静态局部变量如果没有进行初始化的话,对于整形变量系统会自动对其赋值为0,对于字符数组,会自动赋值为'\0'. (2)修饰全局变量 对于一个全局变量,它既可以在本源文件中被访问到

对malloc的返回值应该如何转型

∥☆過路亽.° 提交于 2019-11-27 08:32:45
本文概括叙述了一篇老文的内容,并且总结对malloc返回值的3种转型方式,(相对于原文)更全面的总结其各自的应用范围。 1. 原文内容 2. 对malloc的3种转型方式 3. 各自的应用范围 以前有篇文章叫《C/C++ 误区 —— 强制转换 malloc() 的返回值》。 文章大致内容是: 1. malloc函数在<stdlib.h> 或者 <cstdlib>头文件中,而不是<malloc.h>。 2. 由于C语言最初没有void类型,所以是使用char*来代表通用指针。 /* the old declaration of malloc */ char * malloc(size_t size); char * p = malloc(size * sizeof ( * p) ); /* 可以, 不需要转型 */ T1 * p1 = malloc(size1 * sizeof ( * p1) ); /* ( T1 != char ) 不可以 ,char*不能 隐式转换 成T1* */ T2 * p2 = ( T2 * )malloc(size2 * sizeof ( * p2) ); /* ( T2 != char ) 可以,显示类型转换 */ 3.C语言后来引入了void类型,就可以使用void*代表通用指针,同时规定void*可以 隐式转换 到 任意 指针类型。 /* the

C Primer Plus 第7章 C控制语句:分支和跳转 本章概要

自作多情 提交于 2019-11-26 17:16:31
在本章中您将学习到以下内容: *关键字 if / else / switch / continue / break / case / default / goto *运算符 && || ?: *函数: getchar() / putchar() 以及ctype.h系列 *怎样使用if和ifelse语句,以及如何嵌套使用它们 *使用逻辑运算符将关系表达式组合为更加复杂的判断表达式 *C的条件运算符 *Switch语句 *break continue 和 goto跳转 *使用C的字符I/O函数:getchar()和putchar()。 *由ctype.h头文件提供的字符分析函数系列。 学完本章,您将获得设计按您希望的方式运行的程序所需的全部基本知识。 来源: oschina 链接: https://my.oschina.net/u/2754880/blog/689761