
小话c语言
文章平均质量分 75
从现象出发,略微深入到内部原理
程序员小迷
从前有只猫,它不去抓老鼠,而是想吃面包店的面包,最终它变成了人.
展开
-
static成员变量的本质?静态变量?静态类有什么意义?全局变量?类函数?
面向对象编程语言喜欢将全局变量转移到类内部变成static变量,看起来不像全局变量。事实上,编译器会将static成员变量和全局变量看做的一样的,编程语言的写法减少程序员随意操作全局变量的可能,虽然事实上它们就是全局变量。ObjC类不支持static变量,可以用C语言全局变量的方式来实现static变量。原创 2025-02-04 10:54:29 · 847 阅读 · 0 评论 -
为什么会有头文件循环依赖?搜索路径?头文件包含?如何包含头文件最多只有一次?
有头文件的编程语言体系中,头文件的本意是给其他文件提供基本的类型、声明或者宏等讯息供参考,让编译器知晓这些类型讯息。一般的原则是,越是common的头文件会被其他头文件依赖,即xxx.h很可能会包含common.h. 但定义common以及不同头文件的依赖很可能陷入一个困境,大家都想要对方头文件的讯息,这就出现了头文件循环依赖。原创 2025-02-03 10:49:33 · 1054 阅读 · 0 评论 -
ObjC为什么有方括号调用方法的语法?ObjC为什么能实现动态消息传递?Objective C和C语言有什么区别?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?
object doSomething]的意义和object.doSomething()的意义是完全不同的,也许可以简单理解成都是调用了doSomething方法。事实上,前者代表向object发送doSomething消息,后者则是和C语言类似,代表一个方法调用。前者会将消息发送到一个运行时,运行时将会寻找对应object的对应方法,也许没找到,也许会找到。ObjC增加方括号发送消息,是为了兼容C语言本身的函数调用,不至于出现二选一的境地。原创 2025-02-01 10:47:39 · 449 阅读 · 0 评论 -
.cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?
cc是C++语言使用的扩展名,一种说法是它是c with class的简写,当然C++语言使用的扩展名不止.cc和.cpp, 还包含.cxx, .c++, .C等,这些在不同编译器系统采用的默认设定不同,需要区分使用。当然,编译器提供编译选项将源代码指定为特定编程语言的方式,例如gcc提供-x c++将源代码指定为c++代码,哪怕源代码扩展名是.java也会被当做c++代码。原创 2025-01-31 11:48:33 · 888 阅读 · 0 评论 -
变量声明是否可以放在语句之后?变量声明?声明变量一定需要指定类型吗?函数范围快捷使用临时变量?
早期编程语言都需要指定变量类型,随着编程语言不断发展,新的编程语言允许编译器自动推导变量类型,允许不指定变量类型。对于支持缺省类型的编程语言,初始化可以用缺省类型,但如果是声明,缺省类型就不能缺少。原创 2025-01-30 11:17:05 · 799 阅读 · 0 评论 -
ObjC为什么用@前缀?GCC支持Objective C的故事?什么是Xcode?NSString *s = @“hello“变量s是不可变的吗?NSLog和printf的区别?ObjC和C语言?
Xcode是由苹果公司开发的一个集成开发环境(IDE),主要用于开发macOS、iOS、iPadOS、watchOS和tvOS应用程序。Xcode包含了编译器、调试器、模拟器、图形界面设计(Interface Builder)、代码编辑器、文档和API库等工具,为开发者提供了一个全面的开发和测试平台。Xcode于Mac平台地位等同于Visual Studio于Windows的地位。它可开发Swift、C、C++、Objective-C、Objective-C++等语言,默认采用git版本控制。原创 2025-01-30 11:11:33 · 694 阅读 · 0 评论 -
ObjC为什么能实现动态消息传递?早期的ObjC编译器如何实现的?ObjC和C语言?Objective-C?Objective-C 1.0和2.0有什么区别?
乍看ObjC的消息传递,和普通函数调用没什么区别。Objective-C 利用了其运行时系统(Runtime System)来实现动态消息传递。运行时系统是 Objective-C 的一部分,它允许在运行时动态地添加、修改和查询类和对象。运行时系统提供了动态查找方法实现的能力,当一个对象接收到一个消息时,运行时系统会查找该对象的方法列表,以确定是否有匹配的方法。原创 2025-01-29 19:49:07 · 830 阅读 · 0 评论 -
C语言#include头文件真的是插入代码吗?头文件并不是编译单元?为什么会有头文件循环依赖?如何得到编译器预处理头文件搜索路径?如何得到编译器预处理搜索到的头文件位置?源代码一定需要包含头文件吗?
既是又不是。原创 2025-01-19 11:07:29 · 767 阅读 · 0 评论 -
如何包含头文件最多只有一次?搜索路径?头文件包含?VS2019的c代码不包含stdio.h就无法编译通过?系统头文件路径?-I <头文件PATH>一定会最先搜索吗?
早期,标准的C语言采用#ifndef/#define的模式让头文件永远只能被包含一次,避免重复。事实上,这种写法更多是利用了条件编译宏,如果不小心将不同头文件用了同一个宏判断,会出现稀奇古怪的错误。ObjC引入了#import包含头文件,以编译器做担保,只能包含一次。一种非标准,但是不少编译器支持的新写法是#pragma once,GCC、Clang、MSVC都支持这种扩展写法。原创 2025-01-19 11:02:03 · 477 阅读 · 0 评论 -
ObjC和C语言?Objective C++也是一门语言?哪些语言可以称为C系语言?什么是Cocoa?什么是Xcode?NSLog和printf的区别?早期的ObjC编译器如何实现的?ARC是何时引入
Cocoa是苹果操作系统macOS和iOS上的应用程序开发框架集合,核心语言是Objective-C编程语言,在移动平台被称为Cocoa Touch,Cocoa包含多个子框架,其中最重要的包括Foundation和AppKit(macOS上)或UIKit(iOS上).Foundation框架提供了一系列与图形用户界面无关的基本服务,如字符串处理、集合、文件系统操作等。这些服务对于所有类型的应用程序都是必要的基础设施。原创 2025-01-18 10:27:10 · 754 阅读 · 0 评论 -
为什么苹果公司Cocoa类库有不少NS前缀?什么是Cocoa?Cocoa和Cocoa Touch是什么语言写成的?Carbon库的没落?Foundation.framework的底层实现?API法王?
Cocoa是苹果操作系统macOS和iOS上的应用程序开发框架集合,核心语言是Objective-C编程语言,在移动平台被称为Cocoa Touch,Cocoa包含多个子框架,其中最重要的包括Foundation和AppKit(macOS上)或UIKit(iOS上).Foundation框架提供了一系列与图形用户界面无关的基本服务,如字符串处理、集合、文件系统操作等。这些服务对于所有类型的应用程序都是必要的基础设施。原创 2025-01-12 11:59:49 · 627 阅读 · 0 评论 -
为什么设置MSVC cl.exe到PATH路径,依然无法正常编译?为什么MSVC toolchain有多个cl.exe?Clang也兼容MSVC?Clang/GCC/MSVC编译器对比
MSVC可以正常编译C/C++代码的前提,还包括INCLUDE/LIB路径等都正确配置,而这无法仅仅通过MSVC cl.exe的PATH路径来完成。VS提供了一个官方的配置MSVC环境的方式,可以通过开始菜单的"Developer Command Prompt for VS 2019"进入MSVC环境,这里的cl.exe才能正常编译。原创 2025-01-12 11:51:32 · 749 阅读 · 0 评论 -
编程语言字符集有两个?编程语言的字符集?Unicode字符?为什么这种变量名“\u0061\u0062”都能编译通过?为什么可以用中文命名标识符变量?源代码中字符串编码和源代码编码一样吗?
编程语言一般有两个字符集,一个是源码字符集,一个是编码字符集。出现这两个字符集的原因,可以参考。原创 2025-01-11 13:58:52 · 867 阅读 · 0 评论 -
为什么VS编译UTF-8格式源代码, 代码中字符串却是ANSI编码?为什么某些编辑器编写源代码编译会报错?编程语言字符集有两个?为什么中文字符串会报出错误“C2001: 常量中有换行符“?
说到底,问题的根源在于源代码编码是给编译器看的,可以是任何编码,只要编译器支持的编码就可以,最终生成机器码不存在编码一说。但,源代码中的字符串是实打实会交给控制台或者GUI程序展示,它的编码正确性很重要,一旦不匹配就很可能乱码。所以,源代码中字符串的编码,编译器一般采用贴近本机操作系统的默认编码,Windows当然是ANSI编码,Linux平台一般为UTF-8编码。这就出现和源代码编码不一致的情况了。原创 2025-01-05 11:11:43 · 704 阅读 · 0 评论 -
什么是BOM?VS如何编译没有BOM头的UTF-8源代码?GCC和VS对BOM头处理有何不同?如何检测文件编码格式?如何查看二进制文件前几个字节?
全称是,文件开头的特殊标记,用于指示文件编码。UTF-8编码文件开头以EF BB BF这三个字节作为BOM头,可以给应用程序明确指示为UTF-8编码,而不需要考虑任何ANSI编码或其他编码的可能。原创 2025-01-05 11:01:47 · 1027 阅读 · 0 评论 -
为什么中文字符串会报出错误“C2001: 常量中有换行符“?VS如何编译没有BOM头的UTF-8源代码?为什么可以用中文命名标识符变量?字符串默认编码?源代码中字符串编码和源代码编码一样吗?
如果是用VS,一种很大的可能是VS没有正确识别源代码编码格式,比如是UTF-8格式,no BOM. VS没有发现UTF-8或UTF-16的BOM头,会默认按ANSI编码(中文操作系统默认是GB2312)解析源代码,包括源代码中的字符串,即将UTF-8格式的字符串字节用GB2312来解析,自然可能会产生问题。原创 2025-01-04 10:30:55 · 616 阅读 · 0 评论 -
Visual Studio默认源代码编码格式?为什么MSVC toolchain有多个cl.exe?如何检测文件编码格式?什么是UCRT?VS如何编译没有BOM头的UTF-8源代码?
从Visual Studio 2015开始,CRT被重构成UCRT. UCRT已变成Windows 10组件的一部分。UCRT统一了微软对于不同子平台CRT不同的缺点,可以统一维护。示例:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86\ucrt.lib。原创 2025-01-01 11:39:00 · 831 阅读 · 0 评论 -
什么是OEM代码页?怎么证明代码页不匹配的问题?Windows代码页是什么?什么是活动代码页?为什么会遇到“warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保
Windows平台cmd.exe属性设置里有"当前代码页"这一项,它并不是什么新颖的东西,就是字符编码的另外一种表达。中文操作系统一般是936 (ANSI/OEM - 简体中文 GBK). 当然,用chcp命令也可以看到活动代码页: 936.代码页这个术语起源于早期计算机时代,当时IBM将其用于指代电脑BIOS(基本输入输出系统)本身支持的字符集编码。在那时,大多数操作系统都是基于命令行界面的,它们依赖于BIOS提供的VGA(视频图形阵列)功能来显示字符。原创 2025-01-01 11:21:19 · 847 阅读 · 0 评论 -
Windows代码页是什么?什么是OEM代码页?什么是活动代码页?怎么证明代码页不匹配的问题?为什么会遇到“warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保
原始设备制造商 (OEM) 代码页是非 ASCII 值表示线条绘制和标点字符的代码页。这些代码页最初用于 MS-DOS,但仍用于控制台应用程序。代码页分为两种,一种是OEM代码页,代表控制台应用程序,另一种是ANSI代码页,代表GUI应用程序中不采用宽字符(Unicode)编码采用的代码页。GetACP函数可以获取当前Windows ANSI代码页。代码页 - Win32 apps | Microsoft Learn代码页标识符 - Win32 apps | Microsoft Learn。原创 2024-12-29 11:19:40 · 719 阅读 · 0 评论 -
为什么Windows中文默认编码不是UTF-8?文本框输入法输入英文字符wm或者中文“我们“, 程序内部是什么编码?为什么VS编译UTF-8格式源代码, 代码中字符串却是ANSI编码?
UTF-8编码出现的比中文编码更晚,这造成了Windows在大陆必须先用中文编码。虽然到21世纪,流行UTF-8编码,但也不能直接改掉,避免大量不兼容的问题。原创 2024-12-28 06:04:41 · 1019 阅读 · 0 评论 -
什么是活动代码页?怎么证明代码页不匹配的问题?什么是OEM代码页?Windows代码页是什么?为什么会遇到“warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保
原始设备制造商 (OEM) 代码页是非 ASCII 值表示线条绘制和标点字符的代码页。这些代码页最初用于 MS-DOS,但仍用于控制台应用程序。代码页分为两种,一种是OEM代码页,代表控制台应用程序,另一种是ANSI代码页,代表GUI应用程序中不采用宽字符(Unicode)编码采用的代码页。GetACP函数可以获取当前Windows ANSI代码页。代码页 - Win32 apps | Microsoft Learn代码页标识符 - Win32 apps | Microsoft Learn。原创 2024-12-28 05:58:55 · 947 阅读 · 0 评论 -
苹果电脑可以安装windows操作系统吗?Mac OS X/OS X/macOS傻傻分不清?什么是Mac OS Classic?不同操作系统主要用什么语言编写?
Mac OS Classic的历史可以追溯到1984年,当时随着第一代Macintosh电脑的发布而首次亮相。不过Classic在后面的发展一直并不是很好,在2001年12月发布了Mac OS 9.2.2之后,Classic Mac OS的历史画上了句号。随后,苹果公司推出了Mac OS X,这是一个全新的操作系统,结合了NeXTSTEP的先进技术和Classic Mac OS的易用性。Mac OS X的推出标志着苹果操作系统进入了一个新的时代,为后来的macOS奠定了基础。原创 2024-12-21 09:57:37 · 275 阅读 · 0 评论 -
iOS和macOS内核的关系?内核只用C语言,可以完成吗?内核代码只有用C语言这种高级语言吗?内核和驱动的关系?
iOS和macOS的内核都基于XNU(X is Not Unix),早期是一个混合内核,结合了微内核和宏内核的特性。底层微内核架构MACH作为内核的核心,内核需要向它发送消息完成底层调度,但是,这种效率不高。新版本都已经改成宏内核,和Windows内核、Linux内核一样的宏内核。原创 2024-12-14 10:20:16 · 678 阅读 · 0 评论 -
VS2019的c代码不包含stdio.h就无法编译通过?头文件路径搜索顺序五花八门,有没有规律?搜索路径?
有时,为了做一些测试,不希望包含系统头文件stdio.h, 只希望用extern引用printf声明。但在VS2019可能会遇到链接错误:"error LNK2019: 无法解析的外部符号 _printf,函数 _main 中引用了该符号".原因是VS2019将许多标准库采用内联方式处理,即不需要特别链接ucrt,所以需要特别指定使用legacy stdio lib来让链接器通过。原创 2024-12-08 09:45:27 · 939 阅读 · 0 评论 -
如何得到编译器预处理搜索到的头文件位置?如何得到编译器预处理头文件搜索路径?/usr/bin/cpp是C++相关的程序吗?预处理?gcc 1.c和g++ 1.c预处理有什么区别?
gcc可以通过-MD命令获取编译的头文件依赖关系。例如gcc -MD demo.c可以得到类似如下:......原创 2024-12-07 10:08:13 · 752 阅读 · 0 评论 -
.i和.ii文件的区别?.s和.S的区别?ifdef和#if defined的区别是什么?
if defined它提供了更大的灵活性,可以在括号内使用更复杂的宏表达式,如。总结一下,当汇编代码中有预处理宏或者头文件包含,一定要用大写.S.微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。若文章对您有帮助,欢迎关注。原创 2024-11-29 11:08:37 · 442 阅读 · 0 评论 -
ifdef和#if defined的区别是什么?宏展开?哪些编程语言支持macro(宏)?C语言宏和Rust宏的区别?_GNU_SOURCE是何方神圣?如何获取预处理器定义了哪些宏?
宏,是一种批量处理的称谓。计算机科学中,代表根据一系列预定义的规则替换一定的文本模式。宏起源于汇编语言macro替换。宏用于预处理,在编译之前,sizeof是编译期计算,它是在预处理之后,所以不能将sizeof放到预处理指令中判断。GCC/G++ 提供了-dM选项可抓取预处理器预定义了哪些宏,可方便程序员了解差异。对于C代码,用gcc -dM -E -x c /dev/null对于C++, 用g++ -dM -E -x c++ /dev/null。原创 2024-11-28 13:38:36 · 861 阅读 · 0 评论 -
内核只用C语言,可以完成吗?内核代码只有用C语言这种高级语言吗?C语言应用范围有哪些?iOS和macOS内核的关系?
答案是不行的。尽管C语言编译器可以生成内核所需的大部分代码,和硬件相关,例如CPU体系结构紧密相关的指令,是无法用C语言生成的,因为C标准没有定义这些,必须由特定的汇编指令完成。原创 2024-11-26 09:54:47 · 1151 阅读 · 0 评论 -
CPL语言?B语言的祖先BCPL?B/NB/C语言的故事?
CPL,全称是, 是20世界60年代初期由Algol60启发发展而来的一门语言。CPL是1963年由英国剑桥大学提出的一种编程语言。它试图成为一种大而全的语言,但在实践中发现,这种全面性也带来了编写不便和难以实现的问题。它的设计很复杂,尽管从来没有真正被广泛使用。后来的语言,如BCPL、B语言和C语言,是从CPL演变而来,但通过减少特性和简化语法来提高易用性和实现效率。原创 2024-11-25 11:20:23 · 890 阅读 · 0 评论 -
Unix系统用什么语言编写?不同操作系统主要用什么语言编写?软件都用哪些编程语言写的?
最早是在1969年,PDP-7平台用汇编程序完成了最初的 Unix系统,后来随着B语言演化,逐渐用B语言编写,但B语言过于笨重,1973年,用C 语言重写了 PDP-11 的 Unix 内核。原创 2024-11-25 11:10:45 · 557 阅读 · 0 评论 -
B语言的起源?New B语言的故事?B语言代码实例?
B语言最早是Ken Thompson 和 Dennis Ritchie 于 1969 年左右在贝尔实验室开发的一种编程语言,主要基于BCPL语言,当时Thompson在Mulcs项目中使用的语言。原创 2024-11-24 13:09:37 · 389 阅读 · 0 评论 -
MSVC发展的重要时刻?Clang也兼容MSVC?为什么MSVC toolchain有多个cl.exe?为什么设置MSVC cl.exe到PATH路径,依然无法正常编译?
没错,Clang设计目标是GCC & MSVC compatibility,Windows版本的Clang编译器,默认clang.exe是兼容GCC选项,clang-cl.exe是兼容MSVC编译选项。助您在编程路上越走越好!原创 2024-11-17 11:41:42 · 390 阅读 · 0 评论 -
Clang也兼容MSVC?如何获取编译器的版本号?编译器支持的版本?如何知道当前编译器默认C/C++标准是多少?
没错,Clang设计目标是GCC & MSVC compatibility,Windows版本的Clang编译器,默认clang.exe是兼容GCC选项,clang-cl.exe是兼容MSVC编译选项。原创 2024-11-13 11:01:06 · 974 阅读 · 0 评论 -
如何获取预处理器定义了哪些宏?为什么预处理条件编译不能解析sizeof表达式?
GCC/G++ 提供了-dM选项可抓取预处理器预定义了哪些宏,可方便程序员了解差异。对于C代码,用gcc -dM -E -x c /dev/null对于C++, 用g++ -dM -E -x c++ /dev/null- 可以看到形如#define __amd64__ 1之类的定义,可判断是64位还是32位。例如:............Clang类似GCC,但不能用/dev/null作为参数。xxx.c。原创 2024-11-13 10:50:25 · 826 阅读 · 0 评论 -
GCC 5.1前默认编译器是C90?如何知道当前编译器默认C/C++标准是多少?如何获取编译器的版本号?
大家会疑惑,GCC 5.1是2015年发布,C99和C11都发布多年,GCC为什么不跟上步伐,将默认编译器设置为C99或C11?因为GCC扩展了C90,包含了一些C99 feature,这些已经满足当时的需求,因为不是所有的C99都和C90般配,C99增加了不少程序员很少使用的features.原创 2024-11-12 10:38:15 · 888 阅读 · 0 评论 -
如何知道当前编译器默认C/C++标准是多少?C/C++编译器和标准的详细信息。C/C++编译器和支持标准。
GCC代码中,可以用__STDC_VERSION__宏(C99之前不支持)和__cplusplus宏判断编译器支持的C标准和C++标准版本。原创 2024-11-12 10:23:55 · 1272 阅读 · 0 评论 -
gcc 1.c和g++ 1.c有什么区别?gcc 1.cpp和g++ 1.cpp有什么区别?GCC和G++有什么区别?
先假设1.c只有C语言语法,不涉及C++语法,我们利用-E/-S指令对比二者编译过程中的差异。原创 2024-11-11 11:26:25 · 460 阅读 · 0 评论 -
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
可以通过g++ --verbose选项查看g++定义了哪些宏。若文章对您有帮助,欢迎关注。助您在编程路上越走越好!微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。原创 2024-11-11 11:14:22 · 636 阅读 · 0 评论 -
C/C++编译器和支持的标准的详细信息
注意:上面提到的是对应编译器支持全部或者大部分的标准的时间,事实上在此之前版本编译器就已经在逐步支持,只是支持程度有限。微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。若文章对您有帮助,欢迎关注。助您在编程路上越走越好!原创 2024-11-09 08:19:06 · 738 阅读 · 0 评论 -
int类型的长度为什么不统一?int类型和硬件寄存器有多统一?数据类型长度是编译器决定的?
以C语言为例,它为了支持不同硬件平台,在计算机早期,硬件资源包括内存资源非常紧张,C语言标准不能直接规定int类型就是16位或者32位,这样会造成其它平台不能运行。故,标准做了取舍,不规定int类型的确切长度,但规定了与它相关的整型类型长度的大小关系,以此既支持不同平台,又避免不同平台带来类型长度出现long比int还小的混乱。但,不得不说,在不同平台、不同编译器下,C语言类型长度产生的问题一直存在。原创 2024-10-31 18:22:57 · 523 阅读 · 0 评论