C与跨平台开发(C#跨平台开发)

网友投稿 345 2022-10-07


C与跨平台开发(C#跨平台开发)

C语言

C 语言是在 1969 到 1973 年间,由贝尔实验室的 Dennis Ritchie 最初为重写 unix 操作系统而开发的,它成功替代了汇编语言开发操作系统的模式,随后得到了广泛飞速的发展。由于几大流行操作系统的内核 (Linux、Windows等) 都是由 C 开发的,所以称之为系统编程语言,其能力不局限于系统开发。常见的高级编程语言或脚本语言,像 Java、Python、Perl 和 PHP 等都是应用类编程语言,对开发人员来说,由这些语言编写的代码,不存在运行平台的问题,很多高级语言也是由 C 来编写的。 而与众多流行的高级编程语言相比,C 语言是一种与平台真正相关的编程语言 (C++ 可以认为是 C 的超集)。编译工具将 C 源代码翻译成某种机器指令集的二进制程序,这种程序只能在相应的操作系统和硬件平台上运行。Java 程序则仅需一次编译,就可到处运行,与具体的硬件平台无关,唯一条件就是该平台上得有 java 虚拟机。

跨平台开发

跨平台问题

C 语言本应该是跨平台的,几乎每个平台都原生支持 C 开发环境。由于 C 编译器实现的差异性和操作系统的多样性,导致用 C 开发应用时存在跨平台运行问题。 有必要说一下 C 语言的几个主要标准的进化

K&R C经典 C,事实标准,许多编译器的最低标准要求 C89标准 C,大部分 C 代码都是 C89 兼容的 C99引入了非常多的新特性,有较多的 c 编译器提供支持,gcc 就支持的很好,但微软公司对这个标准不那么热心,其集成开发工具 Visual Studio 2013 才开始比较良好地支持 C99 特性,这也成了软件从 Linux 系统移植到 Windows 平台的一个障碍。

新特性有:

结构定义

struct vectord { size_t len; double arr[]; // the flexible array member must be last };

这样使用

//申请内存尺寸 sizeof(struct) + array_len*sizeof(array element) struct vectord *vector = sizeof(struct vectord) + array_len*sizeof(double); vector->len = ...; for (int i = 0; i < vector->len; i++) vector[i] = ...

初始化结构的时候允许对特定的元素赋值,形式为:(微软的一些编译器同样不支持。)

struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 }; // 3,4 是对 .c,.d 赋值的 struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 };

其他标准C11 等,如果是跨平台开发,似乎可以无视最近标准引入的新特性了。

我们在用 C 进行开发时,尽量使用 C89 标准和部分 C99 特性,在需要依赖操作系统平台特性时,通过宏来控制相应平台上的特殊代码——

#if defined(_WIN32)#define WIN32_LEAN_AND_MEAN#include #else#include #if defined(unix)#include #endif#endif #if defined(_WIN32)#elif defined(_AIX)#include #include ...#elif defined(linux) ...#elif defined(sun) && defined(SVR4)...#endif

宏定义是 C 语言的一个特色,功能很多;可以利用它针对特定平台编译特定代码,其他平台的代码不会编译连接到执行文件中,这样产生的程序规模就会小很多,同时产生了平台依赖。而 java 程序,如果要执行特定平台的业务,需要在运行时来检查当前运行的环境,再来做出选择。 当然,我们是站在巨人肩膀上进行软件开发的,不用亲自实现每项功能,在开源世界里有许许多多通用的、成熟的工具库可以使用。

NSPR (NetScape Portable Runtime)它为非 GUI (图形界面) 开发提供了一套平台独立的系统工具库,涉及的内容包括:NSPR 的目标是在各个操作系统环境提供统一的 API,它不是努力输出各个操作系统的最广泛特性,而是提供最优解或者说是最佳实践,这些功能是现代操作系统的共有特性。如果出现新的操作系统,将 NSPR 移植到新平台的成功率是非常高的,主流系统 NSPR 均有支持。浏览器 Firfox 就用到了它。该库虽历史悠久,但生命力强盛。接口设计的比较稳定,具有很好的二进制兼容性。 线程 线程同步 文件和网络IO 时间 内存管理 共享库处理

APR (Apache Portable Runtime)Apache 的跨平台库,除了基本的操作系统抽象外,还提供了比较丰富的工具。

OpenSSL网络安全通讯库

libcurl客户端网络通信开发库,支持非常多的网络协议,HTTP(S)、FTP(S)、POP3、SCP 和 SMTP 等等。

很多工具库首先以 C (或C++) 的形式出现,然后再为其他高级语言提供功能扩展。 跨平台开发,除了语言层面上的,还有编译工具链的问题,涉及如何建立工程文件,使用什么编译器等等。CMake 系统可以帮助解决跨平台工程文件构建问题,先为平台生成对应开发环境的工程文件,再由平台上的编译工具进行编译;为可以生成 visual studio 工程文件,也可以为 Unix-like 系统生成 Makefile。

小结

C语言既可进行操作系统开发,也可进行应用开发,适用范围广泛,对C开发人员来说,想象力限制了开发能力。但它不是马斯洛大锤,所要解决的问题也不都是钉子。在实践中,需要在软件运行速度和开发效率等问题上取得平衡。(徐品华 | 天存信息)

Ref

C (programming language) Flexible array member Mozilla-About_NSPR CMake


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用过滤器防sql注入(防止SQL注入的最佳方式)
下一篇:31类API安全测试的小技巧(接口的安全测试)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~