这两天听一个老外讲师讲Linux Compile和Debug的Training,看到一些有意思的东西,找了点资料,写出来.算是第一篇有点意义的文章.
这两个宏以前都没见过,据说都是内核里常用的东东,厄,确实接触得少.
首先是__stringify宏:
g了一下,找到一篇文章,以下内容都是转载,仅经过验证和整理,粘出内容:
宏定义:
在 linux/stringify.h中
#ifndef __LINUX_STRINGIFY_H
#define __LINUX_STRINGIFY_H
/* Indirect stringification. Doing two levels allows the parameter to be a
* macro itself. For example, compile with -DFOO=bar, __stringify(FOO)
* converts to "bar".
*/
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
#endif /* !__LINUX_STRINGIFY_H */
更深入的解释:
If an argument is stringified or concatenated, the prescan does not occur. If you want to expand a macro, then stringify or concatenate its expansion, you can do that by causing one macro to call another macro that does the stringification or concatenation. For instance, if you have
#define AFTERX(x) X_ ## x
#define XAFTERX(x) AFTERX(x)
#define TABLESIZE 1024
#define BUFSIZE TABLESIZE
then AFTERX(BUFSIZE) expands to X_BUFSIZE, and XAFTERX(BUFSIZE) expands to X_1024. (Not to X_TABLESIZE. Prescan always does a complete expansion.)
OK,简而言之,就是C CPreprocessor对字符串连接宏不做深入展开.
__attribute__宏:
号称GNU C中最好feature之一...
GCC Manual里三则文章:
GCC 4.0 Function Attributes
GCC 4.0 Variable Attributes
GCC 4.0 Type Attributes
感觉Function-Attributes里的format,noreturn以及Variable-Attributes里的aligned和shared应该用得比较多.
最后附老外代码里拿Variable-Attributes中的section做调试跟踪管理文件的片段:
//EXTRA_CMDS=echo -DCHECKSUM=`md5sum SOURCE | cut -f 1 -d " "` -DHOST=`hostname` -DUSER=$USER -DSYSTEM=`uname -a | tr ' ' '-'`
// this macro does two things:
// - makes sure that the compiler does not issue "unused variable" or tried to make
// the static variable go away just because no one is using it.
// - make sure that our data goes into it's own section of the object code.
#define SECTION ".compile_info"
#define ATTR __attribute__((section(SECTION),used))
// the static allows us to use a compiled on tag for each file so you can put it in a common
// header and get stamping for all files in your project.
static const char* ATTR id_file="id_file=" __FILE__;
static const char* ATTR id_base_file="id_base_file=" __BASE_FILE__;
static const char* ATTR id_host="id_host=" __stringify(HOST);
static const char* ATTR id_user="id_user=" __stringify(USER);
static const char* ATTR id_system="id_system=" __stringify(SYSTEM);
static const char* ATTR id_date="id_date=" __DATE__;
static const char* ATTR id_time="id_time=" __TIME__;
static const char* ATTR id_timestamp="id_timestamp=" __TIMESTAMP__;
static const char* ATTR id_string_version="id_string_version=" STRING_VERSION;
static const char* ATTR id_numeric_version="id_numeric_version=" __stringify(NUMERIC_VERSION);
static const char* ATTR id_checksum="id_checksum=" __stringify(CHECKSUM);
static const char* ATTR id_version="id_version=" __VERSION__;
分享到:
相关推荐
《Fanuc 30i宏调用序列:深入理解FANUC MACRO编程》 在工业自动化领域,FANUC数控系统因其稳定性和强大的功能而备受赞誉。其中,FANUC Macro是其核心编程语言之一,它允许用户编写自定义程序以实现复杂的功能。这个...
python库。 资源全名:macro_parser-0.1.3-py3-none-any.whl
在“Fanuc 30i_Macro_Call_Sequence_FANUCMACRO_macro_fanuc_源码.zip”文件中,我们可以找到实际的宏程序源码示例,通过分析这些源码,我们可以更深入地理解宏程序的编写规则、调用方法和实际应用。学习这些源码有...
macro_pack简短说明macro_pack是用于自动进行模糊处理和生成复古格式(例如MS Office文档或VBS之类的格式)的工具。 现在,它还可以处理各种快捷方式格式。 此macro_pack的简短说明macro_pack是用于自动进行模糊处理...
MAKER_MACRO_M3007
本书《SAS_Macro_Programming_Made_Easy》是关于SAS宏编程的入门指南,通过实例教学帮助读者理解SAS宏的使用方法和编程技巧。SAS宏(Macro)是SAS系统中用于提高编程效率和代码复用性的强大工具。通过宏,可以将重复...
标题“USB_macro_keyboard_notzrs_avr_”和描述“USB MACRO KEYBOARD SOURCE CODE”表明,这是一个关于使用AVR微控制器(Atmel AVR)开发的USB宏键盘的项目。宏键盘是一种允许用户自定义快捷键序列的特殊键盘,特别...
macro_swatson.dta
macro_workfile.dta
在本资料“macro-SVD.zip”中,包含了一个名为“macro SVD.docx”的文档,它很可能是详细介绍了如何在SAS中使用SVD宏的教程。 SVD的基本概念是将一个m×n的矩阵A分解为三个矩阵的乘积:U * Σ * V^T,其中U和V是...
【标题】"Osiris-master_Osiris_CS_macro_" 指的是 Osiris 项目的一个主分支,其中包含针对 Counter-Strike (CS) 游戏的宏功能。Osiris 是一个著名的开源 CS:GO (Counter-Strike: Global Offensive) 作弊程序,由...
标题 "nord_drivesystems_eplan_macro_nordac_base_NORD_" 暗示了我们正在探讨的是关于NORD DriveSystems的Nordac Base变频器在EPLAN电气设计软件中的宏应用。NORD是一家知名的德国驱动技术制造商,提供广泛的电机和...
【标题】"nord_drivesystems_eplan_macro_nordac_flex_NORD_flex_" 提供的信息主要涉及NORD DriveSystems公司的Nordac Flex驱动解决方案,这是一个与EPLAN电气设计软件相关的宏或模板。Nordac Flex是NORD ...
标题中的"macro_valueiteration_VFImatlab_zip_"表明这是一个关于马尔科夫决策过程(Markov Decision Process, MDP)的宏(macro)实现,使用MATLAB编程语言,具体是针对值函数迭代(Value Iteration)算法的。...
macro_pack的出现,是为了简化这个过程,帮助研究人员快速创建具有混淆宏的文档,以便更好地理解和测试反病毒软件的检测能力。 该工具的核心特性包括: 1. **VBA混淆**:macro_pack提供了多种混淆技术,可以使得...
标题“Instructions-DaVinci-Macro_Free!_template_silvertsp_”表明这是一个关于DaVinci Macro的使用指南,特别提到了“Free!”模板和“silvertsp”,这可能是针对视频编辑或色彩校正的专业指导文档。描述中的...
标签进一步确认了内容的关键点:“catia_v5_macro”表明是关于CATIA V5的宏,“catia”指代CATIA软件本身,“catia_v5”再次强调版本信息,“top_ten_catia_macro”则强调这些是精选的、最佳的宏。 在压缩包内的...
设有10个学生的成绩分别是76,69,84,90,73,88,89,63,100,80分,试编制一个子程序统计60~69分,70~79分,80~89分,90~99分及100分的人数,放在S6,S7,S8,S9和S10单元中