定义宏的地方很多,当我们在自己的项目中定义宏时,很容易找到它们的定义位置。但是当我尝试学习一些著名的开源项目时,我经常被一个问题所困扰:在哪里可以找到宏的来源,如果我无法得到它的定义,我将无法理解其中的一些(例如其中一些)可以通过他们的名字猜到)。例如,来自 apache 的一些声明:
#if defined(__osf__) && defined(__alpha),
#elif defined(__NSIG)
据我所知,我知道宏有一些可能的起源位置:
- 从这个项目本身,在一些源文件中(这是最简单的,因为我们可以通过一些工具找到它)
- 从一些第 3 个库的一些头文件中,我们可以 grep 它
- 来自 c/c++ 标准头文件(它们在 linux 中的什么位置?)
- 来自操作系统(它们在 linux 中的什么位置?)
- 由配置工具自动生成(很苦,我不知道)
- 从 gcc/g++ 之类的编译工具,或者在 makefile 中我们可以定义一些宏
我有一些问题要咨询:
- 如何区分 os 定义和 gcc/g++ 定义和配置工具生成的宏?它们各自有什么特点吗?
- 如何找到由 os 或标准 C 或编译器定义的源?例如,使用
grep
或find
实用程序 __strange___
整机( ) 梳理找不到一个宏是什么意思cd /;grep __strange___ -r
?
感谢您告诉它们的原理和区分它们的方法,并找到它们的来源!