参考这里Concatenation#include//宏定义#defineGET_NAME(x)#xvoidfun0(){;}intmain(){//获取name==...
The square of8is64 2. ##运算符可以用于宏函数的替换部分 ##就是个粘合剂,将前后两部分粘合起来,也就是有“组成变量名”的意思。特别要和#运算符的功能区分开来,#是连接字符串,而##是连接变量名。 但是“##”不能随意粘合任意字符,必须是合法的C语言标示符。在单一的宏定义中,最多可以出现一次“#”或...
简介:C --- 自定义一个宏打印当前文件名、函数名、行号 1. #include <stdio.h>2.3. #define DEBUG(format,...) printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)4.5.6. int main(void)7. {8. DEBUG("hello world\n");9. return 0;10. }11....
这个程序是编译不过去的,因为宏定义在同名函数定义之前,预编译到print函数时,其名称也被当做宏进行处理,预编译完毕后,编译器编译是程序显然是不对的。如果程序的文件名称是test.c,则linux环境可以通过命令gcc -E test.c > test.i,可以看到预编译结果,有心者可以自己分析下,仔细看看print函数的预编译结果。 如果...
#include <stdio.h> #include <stdlib.h> // 在宏定义中,使用 # 将参数转为字符串,使用 ## 来连接两个参数作为一个整体标识符。 #define STRING(x) #x #define COMBINE(x, y) x##y int main(int argc, char **argv) { int x1 = 1; int x2 = 2; // STRING(x1) 将变成 "x1" // COM...
如果二者作用域没有交叉,那么可以把函数名定义为static。或者在使用宏的地方,不要声明该函数。否则,只能改掉其中一个名字。推荐宏名用全大写字母。函数名用全小写字母或者单词开头字母大写。 这样就不会冲突了。而且根据名字 一眼就可以看出来是宏还是函数。
1.简洁明了:宏函数参数的名称应简洁明了,便于记忆和理解,避免使用冗长或难以理解的名称。 2.准确描述参数含义:参数名称应准确描述其含义,便于其他开发者快速理解其作用。例如,如果宏函数参数用于指定数组的大小,则可以将其命名为“array_size”。 3.避免使用模糊或容易混淆的名称:宏函数参数的名称应避免使用模糊或容...
extern "C" { extern int printf (char *, ...); } class a { public: void sub (int i) { printf ("__FUNCTION__ = %s\n", __FUNCTION__); printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__); } }; int main (void) ...
然后,我们定义了另一个宏CREATE_MACRO,它接受一个参数name。在宏的定义中,我们使用CREATE_MACRO_NAME宏来创建一个新的宏名,并定义了一个函数体,其中打印了一条消息。 最后,在main函数中,我们调用了使用宏创建的宏名为MACRO_Test的宏,从而实现了使用另一个宏来创建C宏名的目的。