C/C++、C#、JAVA(一):代码模板与库代码的引入
代码默认模板
编译性高级编程语言中,几乎每种语言,都有个静态的 main 方法作为程序启动入口,每种语言都有其编写规范。为了学习 C/C++、C#、JAVA四种语言,我们要先从默认代码模板中,慢慢摸索学习。
约定:
我们常常可以看到 函数、方法这两个词,很多人对此进行了混用。
方法,就是 void Test(){}
这样的形式;
函数,指具有确定命名的、并且可以通过名称调用的代码,属性、字段、方法、委托、事件等;
只要能够通过确定的名称调用(使用)的代码块,就是函数;而方法就是 返回值、名称、参数等组成的代码块;
C/C++、Java 主要是 驼峰命名(Camel-Case), C# 是Pascal 规则(帕斯卡命名)。
文章代码和示例比较多,对于命名这方面,可能不会严格按照此语言的规范编写。(主要是笔者习惯写C#)
代码模板
C
#include <stdio.h>
int main()
{
/* 代码 */
return 0;
}
C++
#include <iostream>
using namespace std;
int main()
{
/* 代码 */
return 0;
}
C#
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
/* 代码 */
}
}
}
JAVA
package com.company;
import com.company.test.*;
public class Main {
public static void main(String[] args) {
Test test = new Test();
}
}
C# 和 Java 的 main
方法都是静态入口。
C# 的 main
方法是大写,其余语言都是小写。
库代码的引入和解析
每种编程语言中,例如 sdk 等都会有大量丰富的官方库代码已经自定义库代码,那么,我们应该如何引入使用呢?
C
C语言 源文件以 .c
或 .h
结尾,一般 .h
用来定义成员, .c
用来实现成员。
.c
称为源文件,.h
称为头文件。
C语言中,使用 #include "{文件名称}.{.c|.h}"
或 #include <{文件名称}.{.c|.h}>
来使用系统或自定义的库代码。
简单来说,#include <>
是使用系统自带的代码,#include ""
是使用你自己写的代码或第三方代码。
请参考
http://c.biancheng.net/view/443.html
写代码和编译时,.c
和 .h
文件和里面的代码没有任何联系。
C语言 中没有接口(面向对象),因此考虑到解耦,将函数的定义和实现两个部分分开,.h
文件定义外界可以访问使用的成员,以及如何调用成员。.c
实现 .h
中声明名的成员。
那么,如何使用 .h
和 .c
声明和实现函数,并且能给外部使用呢?
实现 .h
、.c
以及外部调用
编写一个 Test.h
文件。
此文件声明了一个 getA
方法,不需要输入参数,会返回一个 int 类型的值。
extern 关键字,声明了此方法能够被外部调用。
#include <stdio.h>
extern int getA(void);
我们在 main 方法中,使用此方法
#include <stdio.h>
#include "Test.h"
int main() {
int a = getA();
printf("%d",a);
return 0;
}
然后来实现 Test.c
#include <stdio.h>
// 实现 getA方法
int getA(void) {
return 666;
}
以上代码就是 .h
、.c
文件的编写方法以及提供外部调用。
.h
和 .c
文件
前面我说了,.h
、和 .c
文件,没有必然联系。下面我来解释一下。
因为 .h
和 .c
不像 C#、JAVA 中的 接口和继承,没有强制规定,因此可以只写 .h
,或只写 .c
。
.h
也可以实现代码,例如 Test.h
文件
#include <stdio.h>
extern int getA(void) {
return 666;
}
C语言的编译,经历预处理/预编译、编译、汇编、链接四个步骤。
预处理/预处理(Preprocessing):条件编译、宏定义处理等
编译(Compilation): 检查语法,生成汇编
汇编(Assemble):汇编代码转换机器码
链接(Linking):与其它组件组合起来生成可执行文件
资料参考
http://c.biancheng.net/view/1736.html
https://blog.51cto.com/7905648/1297255
.h
和 .c
文件,在最后链接阶段,才会出现真正 联系
。
请参考
https://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html
C++
据说 C++ 之父 Bjarne Stroustrup 博士,都没有搞懂 C++ 这种编程。
C++ 源文件后缀为 .cpp
。
C++ 中,我们看到了 #include <iostream>
,为啥不带 .h
或 .c
?
C++ 是 C语言 的超集,C++ 实现了面向对象,C++ 出现了命名空间和库的概念。
在 C++ 中,#include <stdio.h>
是一般的头文件引用方式;而 #include <iostream>
是 C++ 库的引用方式。引用的是 标准库
。
C++ 标准库分为两部分:
标准函数库: 继承C语言,由不属于类的函数组成。
面向对象类库: 类及其相关函数的集合。
命名空间
前面我们看到了 C++ 代码模板中,还有 using namespace std;
,这一句是引用命名空间。
在 c++ 中,也可以直接实现 .h
声明的 函数,但是这样跟不能体会到 面向对象 的优势。
C++ 使用面向对象,采用 命名空间-类-成员实现 的机构,来编写代码,示例如下。
编写 Test.h
namespace first_space {
int func();
}
编写 Test.c
namespace first_space {
int func() {
return 666;
}
}
main 函数中调用
#include <iostream>
#include "Test.h"
using namespace std;
using namespace first_space;
int main()
{
int a = func(); // first_space
cout << a << endl;
return 0;
}
可以看到,命名空间只是多了个范围限定。
在 C++ 中,函数可以定义在类中,命名空间中,也可以直接写在 源文件中。
C#
C# 是笔者最喜欢的语言,嘿嘿嘿。
C# 中类库编译后,是一个 .dll
文件。
以下是 C# 命名空间和引用命名空间的示例。
namespace ConsoleApp1
{
using Test;
class Program
{
static void Main(string[] args)
{
T666 t = new T666();
t.Test();
}
}
}
namespace Test
{
public class T666
{
public void Test(){}
}
}
C# 中,命名空间没有严格要求。
一般,命名空间以 [项目名称].[目录名称].[目录名称]...
组成。
以项目名称开头,后面每个子目录名称组成。
例如要实现用户身份认证的功能,将这部分代码放到 MyProj/Auth
目录中,那么命名空间就是 MyProj.Auth
。
C# 的源文件以 .cs
结尾,一般来说,一个独立功能的类或接口,使用一个 .cs
文件。
但 C# 中,并不强制要求。这些慢慢学习 C# 时会学习了解到。很大程度上跟 C++ 的命名空间相似。
C# 中以命名空间作为限定范围,对类进行使用。
调用的最小粒度为类、结构体、枚举等。
所有的字段、属性、方法等必须在类中定义和实现。
C# 引入一个命名空间后,便能使用此命名空间的所有的类。
Java
Java 的规则还是比较多的。
Java 的源文件,以 .java
结尾。
每个 .java
文件中,只能有一个 public 类,并且类名称必须跟 .java
文件的名称相同。
Java 中,没有命名空间,而是以包的形式来调用,包名引用严格以目录名称设置。
Java 中,使用 import
关键字来引入包,例如 import java.io.*;
。
有两种引用形式,一种是引用具体的类名
import java.io.PrintStream;
之后便可以使用 PrintStream 类。
另一种是使用 import java.io.*;
,可以使用此包下所有的类。
Java 中,标准库以 java.
或 javax.
开头。
如果想将编写的类提供给外部使用,则要使用 package
关键字。
以下为一个示例.
程序目录结构如下
.
│ main
│
└─com
└─company
│ Main.java
│ MyFrame.java
│
└─test
Test.java
Test2.java
编写两个类,Test,Test2,
# Test
package com.company.test;
public class Test {
public void My() {
Test2 t = new Test2();
}
}
# Test2
package com.company.test;
public class Test2 {
}
main 函数中调用调用
package com.company;
import com.company.test.*;
public class Main {
public static void main(String[] args) {
Test test = new Test();
}
}
C/C++、C#、JAVA(一):代码模板与库代码的引入的更多相关文章
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- 【Java&Android开源库代码剖析】のandroid-smart-image-view
Android应用开发已经进入到相对成熟的阶段,特别在国外,涌现出了各式各样的成熟稳定的开源库,供普通开发者使用.这种情况虽然极大加速了app开发的进程,但同时带来的问题是大多数普通开发者在使用这些开 ...
- 25个Java机器学习工具和库
本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...
- 几种Java的JSON解析库速度对比
java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去 ...
- keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore
通过Android Studio编译器获取SHA1 第一步.打开Android Studio的Terminal工具 第二步.输入命令:keytool -v -list -keystore keysto ...
- Java调用dll动态库
最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...
- Java工具创建密钥库,用于Unity 3D打包、签名、发布
Java工具创建密钥库 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...
- Java程序实现密钥库的维护
1 Java程序列出密钥库所有条目 import java.util.*; import java.io.*; import java.security.*; public class ShowAli ...
随机推荐
- VS自身的单元测试方法DEMO
///用来修饰测试类 [TestClass()] public class Program { private TestContext testContextInstance; /// <sum ...
- Web of science|SCIE|影响因子|SSCI|高被引论文|领域中热点论文|
信息检索: 数据库 Web of science 影响因子只是针对期刊打分,并不是对文章打分.所以对文章评价可以看引用次数. SCIE (Science Citation Index Expanded ...
- 850. Dijkstra求最短路 II
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- QQ公众号出炉 同门相争意欲何为
同门相争意欲何为"> 当初腾讯大张旗鼓地推出微信时,很多业内人士都认为其与QQ在功能.用户等方面多有重叠,肯定会阻碍QQ的发展和微信的成长.没想到,二者避重就轻地在不同的侧重点发展,反 ...
- O2O疯狂烧钱路:止血还是放血好
在国内,无论是互联网巨头还是创业者,很多都将O2O领域当做下一个金矿.而对于很多O2O项目来说,市场规模.用户基数.发展潜力等传统指数依然被当做硬性指标.而为了抢夺用户,很多O2O项目都只能疯狂烧钱, ...
- RocketMQ 单机版安装并测试
一.安装maven 1.下载maven,http://maven.apache.org/download.cgi,并解压: -bin.tar.gz 2.修改系统环境变量,并验证: vim /etc/p ...
- jenkins-设置定时任务
前言 跑自动化用例每次用手工点击 jenkins 出发自动化用例太麻烦了,我们希望能每天固定时间 跑,这样就不用管了,坐等收测试报告结果就行. 一.定时构建语法 * * * * * (五颗星,中间用 ...
- 2018 C笔试题
⼀.单项选择题(15⼩题,每⼩题2分,共30分) 解析:[传值调用],实参和形参之间传递的是“地址” 解析:[优先级]:算术运算符 > 关系运算符 > 赋值运算符 [结核性 ...
- 放弃了程序员互联网高薪,跑去事业单位做IT的尴尬
“你是程序员对吧?”“是啊,怎么了?”“那你帮我修一下电脑吧.”我原来也是一个重点大学毕业,基本上事业里面搞IT就干这些事情,要是以前,我肯定会想,我是程序员和修电脑有啥关系. 但是自从进了事业单位, ...
- java反序列化-ysoserial-调试分析总结篇(6)
前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在h ...