C预处理 | pragma详解

发布时间:2023年12月26日

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


预处理pragma

    • 1. 预处理指令
    • 2. #pragma详细用法


专栏:《精通C语言》


1. 预处理指令

ANSI标准定义的C语言预处理指令

预处理指令含义
#define宏定义,在预处理阶段进行文本替换。
#undef撤销已定义的宏
#include引入其他源文件
#if #else #elif #endif#if 的一般含义是如果#if 后面的常量表达式为true,则编译它与#endif 之间的代码,否则跳过这些代码。命令#endif 标识一个#if 块的结束。#else命令的功能类似于C 语言中的else ,#else 建立另一选择分支(和# if 搭配)。#elif 命令意义与else if 相同,它形成一个if else-if语句,可进行多种编译选择分支。
#ifdef #ifndef条件编译,#ifdef表示如果已经定义了某个宏,#ifndef表示如果没有定义某个宏。
#line改变当前行数和文件名,在编译程序中预先定义的标识符,用法为#line number[“filename”]。
#error编译程序时,如果遇到#error则产生一个编译错误的提示消息,并且会停止编译。
#pragma指定编译器实现特定功能。比如,#pragma once表示只包含一次头文件,#pragma pack(1)指定字节对齐方式等等。

ANSI标准C定义的宏:

__LINE__	//正在编译的文件的行号
__FILE__	//正在编译的文件的名字
__DATA__	//表示编译时刻的日期字符串
__TIME__	//表示编译时刻的时间字符串
__STDC__    //判断该文件是不是定义成标准C程序

#include

#include提供文件包含的功能,在预处理阶段完成,它可以把多个源文件连接成一个源文件,实际上#include是宏替换的一种延伸。使用#include包含文件主要有两种方式,两种方式的区别在于搜索策略不同。

  • #include <path/filename>

    在搜索时直接从编译器指定的路径进行搜索,如果找到文件,则把文件内容替换到#include语句处,如果找不到则报错。一般系统提供的头文件使用尖括号包含。

  • #include “path/filename”

    在搜索时首先从运行程序所在的目录处搜索,如果搜索失败再从编译器指定的路径处搜索,如果仍然搜索失败则报错。用户自定义的头文件必须用双引号包含。

#运算符

#也可以看作一种预处理指令,用法如下

#include <stdio.h>
#include <stdlib.h>

#define PRINT1(x) printf("square of x is %d\n", x * x)
#define PRINT2(x) printf("square of "#x" is %d\n", x * x)

int main()
{
	PRINT1(3);
	PRINT2(3);
	return 0;
}

编译运行,可以看到输出结果如下

[mindtechnist@localhost test]$ ./test 
square of x is 9
square of 3 is 9

##运算符

也叫做连接符,用法如下

#define xNum(n) x##n 

xNum(7) //展开后为 x7

2. #pragma详细用法

#pragma 指令用于设定编译器的状态或者是指示编译器完成一些特定的动作。常用参数如下:

#pragma message

在编译信息窗口输出相应信息,用法为

#pragma message("消息文本")

当编译器遇到这条指令,就会在编译输出窗口打印我们定义的消息文本,比如

#ifdef _X86
#pragma message("is _X86 ...")
#else
#pragma message("is _ARM ...")
#endif

#pragma code_seg

一般用于设置程序中函数代码存放的代码段,在开发驱动程序时使用较多。

#pragma code_seg(["section-name", ["section-class"]])

#pragma once

头文件只被编译一次。

#pragma hdrstop

表示预编译头文件到此为止,后面的文件不再进行预编译。

#pragma resource

#pragma resource "*.dfm"

表示把*.dfm文件中的资源加入项目。

#pragma warning

用法示例

#pragma warning(disable:4507 34) //不显示4507和34号警告信息
#pragma warning(once:4385) //4385号警告信息仅报告一次
#pragma warning(error:164) //把164号警告信息作为一个错误。

#pragma comment
该指令将一个注释记录放入一个对象文件或可执行文件中。常用lib参数,帮我们连入一个库文件。比如:

#pragma comment(lib, "user32.lib")

该指令用来将user32.lib 库文件加入到本工程中。
linker参数,将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include 选项来强制包含某个对象,例如:

#pragma comment(linker, "/include:__mySymbol")

#pragma pack

设置内存对齐方式。


在这里插入图片描述
在这里插入图片描述


文章来源:https://blog.csdn.net/qq_43471489/article/details/130530949
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。