其中,__FILE__宏和__LINE__宏特别有用,因为它们会被展开为引用它们的源文件的名称和行号,从而可用于检测程序的不一致性、异常等情况。 __FILE__会被展开为字符串,__LINE__会被展开为整数。以下是一个简单的示例程序: #include <stdio.h> int main(void) { printf("An error occurred in %s on line ...
1、这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef...
调用宏后,代码中的宏名称会被替换为宏的代码。 例如,可以定义一个宏名称为GENERATE_CODE,并使用以下方式来编写宏的代码: #define GENERATE_CODE \ if (strcmp(__FILE__, "file1.c") == 0) { \ // 当前文件名为 file1.c 时需要执行的代码 \ } else if (strcmp(__FILE__, "file2.c") == 0...
#ifdef DEBUG print ("device_open(%p)\n", file); #endif 如果在它的前面有以下命令行: #define DEBUG则在程序运行时输出file指针的值,以便调试分析。 调试完成后只需将这个define命令行删除即可。有人可能觉得不用条件编译也可达此目的,即在调试时加一批printf语句,调试后一一将printf语句删除去。的确,这是...
C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __FILE__ 代表当前源代码文件名的字符串文字 __LINE__ 代表当前源代码中的行号
ANSI C标准中几个标准预定义宏:__LINE__:在源代码中插入当前源代码行号;__FILE__:在源文件中插入当前源文件名;__DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间;__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;__cplusplus:当编写C++程序时该...
(1)无参宏定义(可以一改全改) 基本格式:#define 宏名 宏替换 #include<stdio.h> #define A 1+4//宏名是一个标识符,接下来有用到A的地方,在预处理的时候直接用宏替换 替换 宏 //宏名要符合标识符命名规则,通常使用大写 int main(){ int a = 0; ...
【编程基础】C语言FILE结构体以及缓冲区深入探讨 在C语言中,用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义文件指针的一般形式为: FILE *fp; 这里的FILE,实际上是在stdio.h中定义的一个结构体,该结构体中含有文件名、文件状态和文件当前位置等信息。我们...
在多文件编程中,通常会使用两种类型的文件:源文件(source file)和头文件(header file)。 源文件(以 .c 扩展名)包含实际的 C 代码,其中定义了函数、变量等。 头文件(以 .h 扩展名)包含函数原型(prototype)、宏定义、结构体和其他声明。头文件通常用于在源文件中引用外部代码。
> ", __FILE__, __LINE__, __FUNCTION__);\ printf(fmt, ##args);\ }while(0) 这里的do...while循环的循环体只执行一次,与不加循环是效果一样。并且,可以避免了上面的问题。预处理文件: 我们的宏函数实体中,while(0)后面不加分号,在实际调用时补上分号,既符合了C语言语句分号结尾的习惯,也符合了...