当前位置: 首页 > news >正文

#pragma 指令

#pragma 指令作用是设定编译器的状态或者是指示编译器完成一些特定的动作

message 参数能够在编译信息输出窗口中输出相应的信息

#pragma message(“消息文本”)

code_seg参数能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它

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

保证头文件被编译一次

#pragma once

pragma warning

#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示 4507 和 34 号警告信息
#pragma warning(once:4385) // 4385 号警告信息仅报告一次
#pragma warning(error:164) // 把 164 号警告信息作为一个错误。
#pragma warning( push [ ,n ] )
#pragma warning( pop )
#pragma warning( push ) :保存所有警告信息的现有的警告状态。
#pragma warning( push, n):保存所有警告信息的现有的警告状态,并且把全局警告等级设定为 n。
#pragma warning( pop ):向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消

将一个注释记录放入一个对象文件或可执行文件中
#pragma comment(…)

常用的 lib 关键字,可以帮我们链入一个库文件

#pragma comment(lib, “user32.lib”) // 该指令用来将 user32.lib 库文件加入到本工程中。

linker关键字将一个链接选项放入目标文件中

#pragma comment(linker, “/include:__mySymbol”)

# if !defined(BOOST_ASIO_NO_DEFAULT_LINKED_LIBS)
#  if defined(UNDER_CE)
#   pragma comment(lib, "ws2.lib")
#  elif defined(_MSC_VER) || defined(__BORLANDC__)
#   pragma comment(lib, "ws2_32.lib")
#   if !defined(BOOST_ASIO_WINDOWS_APP)
#    pragma comment(lib, "mswsock.lib")
#   endif // !defined(BOOST_ASIO_WINDOWS_APP)
#  endif // defined(_MSC_VER) || defined(__BORLANDC__)
# endif // !defined(BOOST_ASIO_NO_DEFAULT_LINKED_LIBS)

内存对齐

#pragma pack

// memAlign.c
// gcc memAlign.c -o memAlign
#include <stdio.h>
#include <stddef.h>#pragma pack (4)
typedef struct st
{char c;		// 起始地址 0; 结束地址 1int  i;		// 起始地址 4; 结束地址 8double d;	// 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节typedef struct st2
{char c;         int  i;        ST   st;       double d;       char c2;       ST   st_arr[3];long l;     int  i_arr[9]; 
}ST2;
#pragma pack ()int main(void)
{printf("c:%zu i:%zu st:%zu d:%zu c2:%zu st_arr:%zu l:%zu i_arr:%zu\n", offsetof(ST2, c), offsetof(ST2, i), offsetof(ST2, st), offsetof(ST2, d), offsetof(ST2, c2), offsetof(ST2, st_arr), offsetof(ST2, l), offsetof(ST2, i_arr));return 0;
}

#pragma pack(n) 的n只能是2的次方幂,目前测试了,n的值可以为1、2、3、8、16,当设置32时会报错
使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
使用指令#pragma pack (),编译器将取消自定义字节对齐方式。

#pragma pack (4)
typedef struct st
{char c;		// 起始地址 0; 结束地址 1int  i;		// 起始地址 4; 结束地址 8double d;	// 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节typedef struct st2
{char c;         int  i;        ST   st;       double d;       char c2;       ST   st_arr[3];long l;     int  i_arr[9]; 
}ST2;
#pragma pack ()```go
#pragma pack (push)	// 保存现在的对齐参数 
#pragma pack (4)	// 将对齐参数改为 4
typedef struct st
{char c;		// 起始地址 0; 结束地址 1int  i;		// 起始地址 4; 结束地址 8double d;	// 起始地址 8; 结束地址 16
}ST; // 结构体大小 16 字节typedef struct st2
{char c;         int  i;        ST   st;       double d;       char c2;       ST   st_arr[3];long l;     int  i_arr[9]; 
}ST2;
#pragma pack (pop)	// 恢复之前保存的对齐参数
#pragma pack(push):保存当前对其方式到 packing stack;
#pragma pack(n):设置编译器按照 n 个字节对齐;
#pragma pack(pop):packing stack 出栈,并设置为对齐参数;## 宏参数转换为字符串常量#运算符```go
// preDel#.c
// gcc preDel#.c -E -o preDel#.i  //预编译
// gcc preDel#.c    // 编译
#include <stdio.h>
#define MY_STR(x) #x
#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
#define CALL(fun) (printf("CALL %s\n", #fun), fun())
void function()
{}
int main(void)
{printf("%s\n", MY_STR(Hello world!));SQR(8);CALL(function);	// 先打印函数名,再调用函数 return 0;
}
# 5 "preDel#.c" 2void function()
{}
int main(void)
{printf("%s\n", "Hello world!");printf("The square of ""8"" is %d.\n", ((8)*(8)));;(printf("CALL %s\n", "function"), function());return 0;
}

把宏参数跟一个字符串组合成一个符号

##运算符

// preDel##.c
// gcc preDel##.c -E -o preDel##.i  //预编译
// gcc preDel##.c    // 编译
#include <stdio.h>
#define __TXT_(name, ...) char g_txt_##name[]={__VA_ARGS__}
int main(void)
{__TXT_(str1, "this is str1");printf("str=[%s]\n",g_txt_str1);return 0;
}
# 2 "preDel##.c" 2int main(void)
{char g_txt_str1[]={"this is str1"};printf("str=[%s]\n",g_txt_str1);return 0;
}
http://www.lryc.cn/news/396029.html

相关文章:

  • 【Excel】 批量跳转图片
  • 网站更新改版了
  • 初识大模型
  • Open3D SVD算法实现对应点集配准
  • bWAPP靶场安装
  • SpringBoot + MyBatisPlus 实现多租户分库
  • 【数据挖掘】银行信用卡风险大数据分析与挖掘
  • 使用 Qt 和 ECharts 进行数据可视化
  • 【机器学习】在【Pycharm】中的实践教程:使用【逻辑回归模型】进行【乳腺癌检测】
  • 【搭建Nacos服务】centos7 docker从0搭建Nacos服务
  • 将 build.gradle 配置从 Groovy 迁移到 Kotlin
  • 5G(NR) NTN 卫星组网架构
  • WEB安全-文件上传漏洞
  • Python函数 之 函数基础
  • 昇思25天学习打卡营第11天|SSD目标检测
  • MySQL篇五:基本查询
  • FreeBSD@ThinkPad x250因电池耗尽关机后无法启动的问题存档
  • pdfplumber vs PyMuPDF:PDF文本、图像和表格识别的比较
  • 深入Django系列
  • 【Python】找Excel重复行
  • 重读AI金典算法模型-GPT系列
  • 仙人掌中的SNMP检测不到服务器
  • git只列出本地分支
  • 算力狂飙|WAIC 2024上的服务器
  • uniapp app端跳转第三方app(高德地图/百度地图为例)
  • 阿里云RDS云数据库库表恢复操作
  • 来一场栈的大模拟(主要是单调栈)
  • 13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar
  • PTA - 编写函数计算圆面积
  • Golang | Leetcode Golang题解之第218题天际线问题