<intrins.h>头文件,#pragma的作用解释

在C语言中,头文件(Header file)用于存储函数、变量和类型的声明和定义。它们通常包含在源代码文件中,以便在编译时被编译器引用和使用。头文件具有以下几个作用:

  1. 函数和变量的声明:头文件中包含了函数和变量的声明,告诉编译器它们的存在和类型。这使得在源代码文件中使用函数和变量时,编译器可以正确处理并生成对应的代码。

  2. 类型和结构的声明:头文件可以包含自定义的类型和结构的声明。这样,在源代码文件中使用这些自定义类型和结构时,可以避免重复的声明,提高代码的可读性和维护性。

  3. 宏定义:头文件可以包含各种预处理宏定义和常量的声明。这些宏定义可以用于定义常量、条件编译和功能开关等。通过在不同的源代码文件中包含同一个头文件,可以共享这些宏定义,提高代码的一致性。

  4. 函数和变量的定义:头文件可以包含函数和变量的定义。在多个源代码文件中需要使用相同的函数和变量时,可以将它们的定义放在头文件中,然后在需要使用的源代码文件中包含该头文件即可。

  5. 模块化和代码组织:通过将相关的函数、变量和类型放在一个头文件中,可以实现代码的模块化和组织。这样,当需要使用某个模块的功能时,只需包含该模块的头文件,而不需要了解其内部的具体实现细节。

需要注意的是,头文件本身并不会直接生成可执行代码,它只包含声明和定义,供编译器在编译时使用。头文件通常使用.h作为文件扩展名,并通过#include预处理指令在源代码文件中包含和引用。
源文件如下:

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

#pragma SAVE

#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif

#pragma RESTORE

#endif

intrins.h 文件,提供了一些内嵌函数的声明和定义。

文件开头包含了版权信息和一些注释。

接下来是条件编译的预处理指令,用于根据编译器类型进行功能的定义和属性的设置。

然后定义了一系列的函数原型,包括 _nop__testbit__cror__iror__lror__crol__irol__lrol__chkfloat_,以及在特定条件下的 abs_illop__push__pop_ 函数。

最后,使用 #pragma 指令进行保存和恢复一些编译器设置。

#pragma的作用

#pragma 是一个预处理指令,用于向编译器发送特定的指示,以控制编译器的行为和设置。它通常用于向编译器提供一些额外的指令或指示,以便进行编译器特定的优化、警告控制、对齐方式设置等。

#pragma 的作用主要有以下几个方面:

  1. 编译器优化指示:#pragma 可以用于向编译器发出性能优化的指示。例如,#pragma inline 可以启用函数内联优化,#pragma optimize 可以设置函数级别的最优化级别等。通过使用这些指示,可以告诉编译器如何优化代码以提高程序的性能。

  2. 编译器警告控制:#pragma 可以用于控制编译器产生的警告信息。例如,#pragma warning 可以用于控制特定警告的显示与隐藏,或者设置警告的级别。通过使用这些指示,可以灵活地控制编译器的警告输出。

  3. 对齐方式设置:#pragma 可以用于设置结构体、变量或对象的对齐方式。例如,#pragma pack 可以设置结构体的对齐方式,或者 #pragma pack(push, n)#pragma pack(pop) 可以在指定的代码块内设置和恢复对齐方式。通过使用这些指示,可以控制内存对齐以提高数据访问的效率。

  4. 其他特定功能指示:#pragma 还可用于执行一些特定编译器的功能指示。例如,#pragma once 可以用于指示编译器只包含一个特定的头文件一次,#pragma message 可以在编译时输出一条自定义的消息等。

#pragma SAVE 是一个特定编译器的指令,用于保存当前的编译器设置,并对一些特定的设置进行修改。它通常与 #pragma RESTORE 配对使用。

#pragma SAVE 的作用包括:

  1. 保存并修改寄存器设置:#pragma SAVE 可以保存当前的寄存器设置,并对寄存器的使用方式进行修改。例如,在某些嵌入式系统中,可以通过 #pragma SAVE 将寄存器设置为保存在栈中,这样在函数调用时不会破坏寄存器的值。

  2. 保存并修改函数库设置:#pragma SAVE 还可以保存当前的函数库设置,并对相关的函数库进行修改。例如,在一些嵌入式系统中,可以通过 #pragma SAVE 设置函数库的命名方式,或者启用/禁用特定的函数库。

  3. 保存并修改其他编译器设置:#pragma SAVE 可能还涉及其他与特定编译器相关的设置的保存和修改。具体的修改范围和效果取决于不同的编译器和平台。

需要注意的是,#pragma SAVE 是特定编译器的指令,其具体功能和使用方法可能会有所差异。在使用时,应查阅相关的编译器文档以了解更详细的信息。另外,由于不同编译器的差异,应谨慎在跨平台或跨编译器项目中使用该指令。

你可能感兴趣的:(嵌入式基础知识,c语言,keil,编译器,#pragma)