让int变成short
C语言强大的宏定义可以让基本所有可识别的标识符变成想要的定义,甚至包括关键字,比如int整型变成短整型。
#define int short
- 还有广为人知的C语言 { } 和Pascal语言BEGIN/END转换的方法:
#define BEGIN {
#define END }
- 需要注意的是,#define宏名称必须是标识符 (macro names must be identifiers),意味着只有普通标识符(包括变量名和函数名)、关键字可以被替换。
#define ; ^
这种代码是无法通过编译的。事实上,替换非ASCII码的可能性非常低,大概率不符合程序员的本意,即使有这种需求,应该是代码真写错了,可以用sed或其他统一替换做修改。
- #define printf my_print 是一种很好的不想改代码做函数替换方法,但需要注意,这可能产生误解。更常用的处理方法是,不要改变库函数printf的本意,#define my_print printf可能更符合意图。
- 替换变量名
- #define a b是将代码中所有a都替换成b, 搞笑效果很不错。
#define a b
int a = 1;
printf("%d\n", b);
头文件路径搜索顺序五花八门,有没有规律?
头文件搜索顺序规则
以GCC为例,用户头文件""和系统头文件<>先后顺序规则如下:
- “”
- 被编译的源代码文件所在当前目录
- -iquote指定的路径(只用于引号括起来头文件,如多个路径,从左到右依次搜索)
- -I指定的路径(如多个路径,从左到右依次搜索)
- -isystem指定的路径(如多个路径,从左到右依次搜索)
- 标准系统头文件路径
- -idirafter指定的路径(如多个路径,从左到右依次搜索)
- <>
- -I指定的路径(如多个路径,从左到右依次搜索)
- -isystem指定的路径(如多个路径,从左到右依次搜索)
- 标准系统头文件路径
- -idirafter指定的路径(如多个路径,从左到右依次搜索)
我曾经写过测试代码,证明了如上规则的正确性。当然,使用man gcc搜索-iquote也可以找到规则。
覆盖系统头文件
- 找到如上规则"标准系统头文件路径"所在的位置,在此之前的路径(或选项指定的路径)都有机会达到覆盖系统头文件的可能。即,手写一个stdio.h, 放在源代码所在的路径,#include "stdio.h"不会再找系统头文件。类似的,利用-I .指定当前目录为系统头文件路径,#include <stdio.h>也不会再找系统stdio.h.
若文章对您有帮助,欢迎关注。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。