C的预编译指令


在C语言中,预编译指令用于在编译之前进行代码的预处理。

# 预编译
gcc -Wall -E hello.c -o hello.i 

#include

用于包含头文件

对于形如 #include "demo.h" 的指令:

  • step1: 编译器首先在当前目录中查找demo.h
  • step2: 未找到,编译器会检查通过-I选项指定的目录
  • step3:仍然未找到,编译器会继续在/usr/include/usr/local/include等标准系统路径中查找。

对于形如 #include <demo.h> 的指令:

编译器会跳过当前目录

  • step1:直接从-I选项指定的目录
  • step2:未找到,在标准系统路径下开始查找
    如果在所有指定的路径中都没有找到头文件,编译器会报错,指出无法打开包含文件。

#define

定义宏

本质就是预处理时,进行文本的匹配替换

简单宏替换

#define PI 3.14159
#include <stdio.h>
int main() {
    double radius = 5.0;
    double area = PI * radius * radius;
    printf("The area of the circle is: %f\\n", area);
    return 0;
}

带参数的宏

这种形式的宏类似于函数,可以接受参数并进行替换。

#define MACRO_NAME(PARAM1, PARAM2, ...)  replacement_text
#include <stdio.h>
#define PRINT_STRING(str) printf("%s\n", str)
int main() {
	char * msg="Hello, World!\n";
    PRINT_STRING(msg); // 展开为 printf("%s\n", msg);
    return 0;
}

在宏定义中使用参数的字符串表示,可以使用字符串化操作符 #

#include <stdio.h>
#define PRINT_MACRO(str) printf("The macro argument is str : %s\n", #str)

int main() {

	PRINT_MACRO(Hello World); // 展开为printf("The macro argument is str : %s\n", "Hello World");
	return 0;
}

#ifdef, #ifndef, #if

进行条件编译

#ifdef#ifndef 仅检查一个宏是否已经定义,而不考虑宏的值
#if 可以检查任何常量表达式,后面跟宏的时候需要考虑宏的值。
常和#elif#else#endif结合使用

#ifdef MY_MACRO
// 如果 MY_MACRO 被定义,执行这里的代码
#elif defined(OTHER_MACRO)
// 如果 MY_MACRO 未被定义,但 OTHER_MACRO 被定义,执行这里的代码
#else
// 如果 MY_MACRO 和 OTHER_MACRO 都未被定义,执行这里的代码
#endif
#define FEATURE_A 1
#define FEATURE_B 0

#if FEATURE_A && !FEATURE_B
// 如果 FEATURE_A 被定义并且其值不为零,且 FEATURE_B 未定义或其值为零,则编译这段代码
printf("Feature A is enabled, but Feature B is not.\n");
#endif

可以使用#undef取消宏定义

#pragma

向编译器发出特殊指令

#pragma pack 是一个非常有用的指令,用于控制结构体、联合体或类在内存中的对齐方式。通过调整对齐方式,可以优化内存使用,特别是在需要与硬件设备或特定协议进行交互时。

#pragma pack(push, 1)  // 设置对齐方式为 1 字节
struct MyStruct {
    char a;
    int b;
};
#pragma pack(pop)  // 恢复之前的对齐方式

#error

在编译时生成错误信息。

#line

改变编译器内部的行号和文件名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值