Hello World
发表于
|总字数:36|阅读时长:1分钟
一个测试的网页
真的是测试用的网页啦
1 | #include <stdio.h> |
文章作者: 寰宇体
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 寰宇体的世界!
相关推荐
2024-07-15
Print.h 开发记(六)V1.6
系列导航:上一篇:Print.h 开发记(五)V1.5 打印库成熟之后,最先”吃自己狗粮”的场景就是调试。V1.6 加入了一整套 debug 宏。 debug:打印变量名和它的值调试时最常写的就是 printf("x = %d\n", x)——变量名要手打两遍。# 字符串化运算符可以让宏自动完成: 12#define debug_valuename_to_str(value) #value#define debug(obj) print(LIGHT_GREEN("debug: "), debug_valuename_to_str(obj) " = ", obj, "\n") debug(count) 展开后自动输出 debug: count = 10,变量改名也不用同步。 WARN_IF / ERR_IF / ERR_EXIT_IF三个按条件触发打印的宏,全部用 do { } while(0) 包裹——这是宏定义多语句的标准写法,保证在 if/else 里展开不出问...
2023-09-30
当 include 遇上 MP4
一个大胆的实验:把写好的头文件 GenShin.h 改名成 GenShin.mp4,然后照常 #include 它,编译器会买账吗? 实验材料:这个”mp4”其实是纯文本先用 file 命令验一下它的真身——GenShin.mp4: C source, ASCII text。它就是一个普普通通的头文件,只是后缀被改了: GenShin.mp4123456#ifndef __GenShin_H__#define __GenShin_H__#define NUM 114514 #endif // !__GenShin_H__ 实验代码main.c12345678910111213#include <stdio.h>#include "GenShin.mp4"int main(){ printf("%d\n", NUM); // NUM 就来自上面这个"mp4" int num = 0; for(int* i = # ; i++) { ...
2024-11-17
宏定义的高级用法
研究 Boost.Preprocessor 的时候整理的一套”宏元编程”套路:用纯宏实现在编译期展开出 N 个变量。不涉及任何编译器扩展,纯标准 C 预处理器。 目标12int BOOST_PP_ENUM_PARAMS(20, a);// 展开后:int a0, a1, a2, ... , a19; 坑一:拼接参数必须经过两层宏123#define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)#define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a##b)#define BOOST_PP_CAT_II(p, res) res 为什么不能直接写 a##b?因为 ## 会阻止参数展开——直接 CAT(BOOST_PP_REPEAT_, 1) 拼出来的是字面量 BOOST_PP_REPEAT_1 而不是它展开后的内容。标准解法就是延迟一层:先拼出 ~, BOOST_PP_REPEAT_1,再扫描一轮时 ~ 被丢弃、参数正常展开。 坑二:循环靠”手写递归表”预处理器没有循环,只能靠宏递归展开模拟。但宏不能直接...
2024-07-19
统计 __VA_ARGS__ 参数个数
可变参数宏 __VA_ARGS__ 有个著名的难题:怎么知道参数有几个?预处理器没有循环、没有计数,但利用”占位符平移”技巧可以完美解决。 技巧原理123#define _PrintMacroArgCount(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,XX,...) XX#define PrintMacroArgCount(...) \ _PrintMacroArgCount("ignored", ##__VA_ARGS__,9,8,7,6,5,4,3,2,1,0) 关键在参数的错位对齐: 传 3 个参数时,展开成 _PrintMacroArgCount("ignored", 1, 2, 3, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) _0 吃掉 “ignored”(占位符),_1~`_3 吃掉真实参数,XX` 恰好落在 3 上 传 0 个参数时,XX 落在 0 上,顺便解决了 __VA_ARGS__ 为空时的逗号问题(##__VA_ARGS__ 会吃掉多余的逗号) 应...
2023-12-08
C语言宏函数的优先级陷阱:一个 MAX 宏的六级进化
最近研究了一下 MAX 宏的进化史:从青铜到王者共 6 个版本(define0.c ~ define5.c),完整记录了一个三目运算符宏是怎么被优先级、副作用、类型问题一步步逼着进化的。 先上本篇的理论基础——C 语言运算符优先级表(16 级,本篇 MAX 宏的悲剧就发生在第 7 级 > 和第 8 级 != 之间): 优先级 运算符 结合律 1 后缀运算符:[] () . -> ++ -- (类型名称){列表} 从左到右 2 一元运算符:++ -- ! ~ + - * & sizeof _Alignof 从右到左 3 类型转换运算符:(类型名称) 从右到左 4 乘除法运算符:* / % 从左到右 5 加减法运算符:+ - 从左到右 6 移位运算符:<< >> 从左到右 7 关系运算符:< <= > >= 从左到右 8 相等运算符:== != 从左到右 9 位运算符 AND:& 从左到右 10 位运算符 XOR:^ 从左到右 11 位运算符 OR:| 从左...
2024-10-05
Print.h 开发记(七)V1.7/V1.8
系列导航:上一篇:Print.h 开发记(六)V1.6 系列最终篇:V1.7 加入字体效果,V1.8 修掉遗留问题并支持无参调用——print 库到此定稿。 V1.7:字体宏除了颜色,ANSI 转义序列还能控制字体效果: 123456789101112// 原始字体宏#define NONE(str) str"\033[m"// 高亮文字#define HIGHTLIGHT(str) "\033[1m"NONE(str)// 斜体文字#define ITALIC(str) "\033[3m"NONE(str)// 下划线文字#define _(str) "\033[4m"NONE(str)// 闪烁文字#define FLASGING(str) "\033[5m"NONE(str)// 反显文字 - 交换前景色和背景色#define Reversedisplay(str) "\033[7m&quo...
评论
GiscusTwikoo
公告
欢迎来到寰宇体的世界 ✨
