c语言 预处理器

概述

预处理器是一种不依赖于c语言的语法,它有独自的书写规范。处理预处理器的内容是编译c文件的第二部(第一步是清除注释)。

预处理器不会产生可执行的代码,而是做一个文字替换。因此原则上c预处理器也可以被其他语言作为预处理器使用。

c预处理器有它独立的语法:

  • 每条命令的结尾不用以封号“;”结尾
  • 一条命令换行前需要在前一行的最后一个字符后加上反斜杠’\’
  • 很多命令都以井号’#'开头,井号后可以跟上任意数量的空格

预处理命令可以分为以下几类:

  • include命令
  • 类对象宏
  • 类函数宏
  • 条件翻译
  • 其它

include命令

与文字代替一样,表达式’#include <….>'将被文件中的内容代替。
语法:
#include <h‐char‐sequence >
#include “y‐char‐sequence”
#include preprocessor‐Tokens //Standard‐C

搜索路径:

  1. "y‐char‐sequence"的搜索路径是在当前工作目录下,y‐char‐sequence可以使用相对路径也可以使用绝对路径
#include "test.h"
#include "verzeichnis/hallo.h"   
#include "c:\user\xyz\test.h"
#include  "../lib/test.h"

注:绝对路径中在windows系统中路径分隔符是’’, linux是’/’。

  1. <h‐char‐sequence>的搜索路径是再编译器预先设定的目录下。可以通过相对路径引入
#include <stdio.h>
#include <sys/stat.h>

注:

  • 同一文件只允许定义一次
    • 当相同的头文件定义了两次, 一个变量或者一个函数就会被定义两次,这回导致编译器报错
    • 如果H文件包含在多个C文件中,那么在每个C文件中都会创建一个独立的变量/函数,所以之后链接器会因为重复命名而放弃链接操作。 因此,头文件中不允许有任何定义。
  • 允许任意数量的声明

include 保护:include语句可以任意嵌套,因此一个H文件可以被包含多次。一方面,这可能导致无限递归,另一方面,也不允许对常量进行多次声明。为了避免多重包含,应该在每个头文件中手动建立一个包含防护:

#ifndef _Projektname_Dateiname_Dateiendung_INCLUDED_
#define _Projektname_Dateiname_Dateiendung_INCLUDED_
//Inhalt
#endif

类对象宏

语法: #define name sequence‐of‐tokens
对应于文本替换,在下面的代码中,name被sequence‐of‐tokens所替换。在注释和字符串中不发生文本替换。像变量和函数名一样,宏不能被定义两次。然而,可以用#undef删除以前定义的宏,这样就可以用#define进行新的分配。

#include <stdio.h>
#include <string.h>
#define   ROT1 5
#define   ROT2
    #   define ROT3     8  //Leerzeichen werden Eleminiert
#define ROT4 /*Test */ "hello world\n"
int main(int argc, char const *argv[])
{
   
    #define ROT5 5
    int a, b;
    a = ROT5;
    b = ROT5 + 6;
    printf("%d\n", a);
    printf(ROT4);
  
    #define ROT6 1, "hallo", 7
    char str[] = "ROT6";
    struct
    {
   
        int a;
        char str[7];
        int b;
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值