欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言预处理#line、#error

程序员文章站 2024-02-22 15:33:52
...

#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符命令的基本形式如下:

#line number["filename"]
其中[]内的文件名可以省略。例如:

#line 30 a.h //其中,文件名a.h 可以省略不写。
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。

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

#define pi 3.14
#undef pi

int a = 0;

void show(){
    a++;
    printf("hello: %d\n",a);
}

void main(int *argv, char *args[]){

    /**
    __DATE__, __TIME__ 
    */
    printf("current line number %d ,current file %s:%s\n",__LINE__,__FILE__, __FUNCTION__);
      
    #line 10 "Demo_01_pointer_ifdef_enum.c"
    printf("current line number %d ,current file %s\n",__LINE__,__FILE__);

}


编译与运行:

-bash-4.1$ gcc -o a Demo_06_#line__LINE__FILE__FUNCTION__TIME__DATA__.c
-bash-4.1$ ./a
current line number 20 ,current file Demo_06_#line__LINE__FILE__FUNCTION__TIME__DATA__.c:main
current line number 10 ,current file Demo_01_pointer_ifdef_enum.c



#error

如果程序中有#error这个预处理指令,那么程序在编译阶段就会直接报错:

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

#define PI 3.14
#undef pi

int a = 0;

void show(){
    a++;
    printf("hello: %d\n",a);
}

void main(int *argv, char *args[]){

#ifndef PI  
#error First include then compile  
#else 
    show();
#endif

#ifdef pi
#error pi was defined
#else 
#error pi wasnt defined
#endif
}


编译:

-bash-4.1$ gcc -o a Demo_07_#error.c
Demo_07_#error.c:26:2: 错误:#error pi wasnt defined
-bash-4.1$