使用大写字母:将宏定义的名称全部使用大写字母,以减少与其他标识符发生冲突的可能性。 #define MY_MACRO(x) ((x) * 2) 复制代码 使用static关键字:在宏定义中使用static关键字,将其范围限制在当前源文件。这样可以防止在其他源文件中意外地使用相同的宏名称。 static int my_macro = 42; 复制代码 使用#undef...
C语言解决函数名与宏冲突 #include<stdio.h>voidf() { printf("function\n"); }#definef() printf("macro\n")intmain() { f();//macro(f)();//functionreturn0; } 函数名加括号
如果二者作用域没有交叉,那么可以把函数名定义为static。或者在使用宏的地方,不要声明该函数。否则,只能改掉其中一个名字。推荐宏名用全大写字母。函数名用全小写字母或者单词开头字母大写。 这样就不会冲突了。而且根据名字 一眼就可以看出来是宏还是函数。
如果定义的宏名称不小心和其他源码中的名称冲突的话,也会造成编译错误,比如定义了一个宏time,那么就有可能会和标准库函数中的time函数冲突。 宏参数中含有逗号 宏可以携带参数,而参数并没有什么要求,宏只是拿到参数的值去替换之后的内容,但如果宏参数中含有逗号,那么就会带来歧义了。比如 // 该宏本身没什么实际使...
limits中的numeric_limits类模板函数max和min 使用时,需要注意,容易与C语言的宏定义min/max冲突 此时有几种解决办法: 1.先取消min/max的宏定义,使用完后恢复 如下: #ifdef min#define__save_min#undefmin#endif#ifdef max#define__save_max#undefmax#endiftemplate<typename T = unsignedint>classXNumberLimit ...
当我们将5和int传入到Malloc是,那么n就是5,type就是int,也就是有一个参数是类型,宏是可以实现的,但函数可以实现,预处理之后替换的结果就是(int*)malloc(5 * sizeof(int))。 宏和函数的对比: 在这里插入图片描述 二、#和##运算符 2.1 #运算符 ...
对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。 另外,这种方式不支持跨平台! #pragma once 方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C++语言标...
由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用...
C语言程序中,func()指的是Function,表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。函数的本质是一段...
没有问题,我们打印了一个全局变量,名为rand。 🆗,那我们再多包含一个头文件呢? 再次运行代码: 哦豁,发生错误了,怎么回事? 这里就发生了命名冲突。 为什么我们加了一个头文件就发生命名冲突了呢? 其实编译器的提示已经很明显了: 如果大家以前了解过rand函数的话就知道它其实是库里面的一个函数,用来产生随机数...