一个#define的理解
相当于给P0取了个别名叫LCD1602_DB,以后所有LCD1602_DB的地方编译器都会用P0替代
这就是定义了一系列常量,
_PC_LINK_MAX的值为0,
_PC_MAX_CANON的值为1,以此类推。
后续程序中可以使用这些常量值,比直接使用0、1这样的常量更容易让程序员或者阅读程序的人理解其中的含义。
// VC 2005及其以上版本
#if defined(_MSC_VER) && _MSC_VER >= 1400
#pragma warning (disable:4786)
此warning产生的原因是因为标识符过长,超过了最大限定255个字。例如:
#define a_really_long_class_name a_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_really_really_really
class a_really_long_class_name
{
public:
a_really_long_class_name() {};
int m_data;
};
void main()
{
a_really_long_class_name test_obj;
test_obj.m_data = 12;
}
类名超过了255个字,使用时就会报4786的waring。在使用STL(C++标准模板库)的时候经常引发类似的错
误,尤其是vector,map这类模板类,模板中套模板,一不小心就超长了。例如:
template <class A1, class A2, class A3, class A4>
class VeryLongClassNameA{};
template <class B1, class B2, class B3>
class VeryLongClassNameB{};
template <class C1, class C2>
class VeryLongClassNameC{};
template <class D1>
class VeryLongClassNameD{};
class SomeRandomClass{};
typedef VeryLongClassNameD<SomeRandomClass> ClassD ;
typedef VeryLongClassNameC<SomeRandomClass, ClassD> ClassC;
typedef VeryLongClassNameB<SomeRandomClass, ClassC, ClassD> ClassB;
typedef VeryLongClassNameA<SomeRandomClass, ClassB, ClassC, ClassD> ClassA;
void SomeRandomFunction(ClassA aobj){}
void main()
{
ClassA AObj ;
SomeRandomFunction(AObj) ;
}
解决方法有两种,一种是直接定义别名:
#ifdef _DEBUG
#define VeryLongClassNameA A
#define VeryLongClassNameB B
#endif
另一种是屏蔽4786warning:
#pragma warning(disable : 4786)
注意屏蔽语句必须放在报错的模板类的引用声明(如#include <vector>)之前,否则还是不起作用。
如果定义了(_MSC_VER) && _MSC_VER <1400
则把4786的警告关闭,,即不提示!
你应该会在其他地方定义了(_MSC_VER) && _MSC_VER <1400
这三行的作用主要是关闭警告提示~!
举例说明#define 作用
#define AAA 100+10
程序在编译前 先把程序中出现的所有AAA替换成100+10
比如有以下语句:int x = AAA*AAA;
那么会替换,int x = 100+10*100+10 = 1110
C语言的宏定义问题
一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。 1.2 宏替换发生的时机 为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境...
c++中 define 是嘛意思
宏定义, 用#define指令,指定用一个符号名称代表一个常量 如 #define P 3.1416 \/\/注意行末不用分号 这样下面的程序就用P 代表3.1416了,不用每次都打很麻烦
C\/C++ 常量、#define、const和constexpr
- 常量:代表固定不变的值,类型明确,值不可修改,如整型、浮点数等。const和constexpr都允许在编译时初始化,但constexpr要求必须在编译时计算其值。- #define:预处理器宏,无类型,预编译阶段进行字符替换,可能导致内存浪费和类型安全问题。- const:运行时常量,内存中只有一个拷贝,避免内存分配,...
C语言宏定义#define的理解与资料整理!希望你能get到!
理解与运用C语言宏定义,是编程中提高代码效率与可读性的关键。宏定义,如同演员的替身,可以在代码中扮演多种角色,但同时也需要我们谨慎使用,以避免潜在的错误。首先,宏定义可以用来定义数值型宏常量,如:define PI 3.141592654 使用宏常量 PI 替代数值,不仅使代码更易阅读,还能在需要修改精度时,...
c语言中#define N 3是什么意思
前面两行是头文件。define N 3 是宏定义,define是定义的意思,这句的意思是把N的值定义为3。在程序中后面出现的所有N的值都为3。fp=fopen("stud","wb");是文件操作。fp是指针变量;fopen()是函数,用来打开文件;stud是文件名;wb是打开或建立一个二进制文件、只允许写数据。这句的意思是...
define和unsigned int在单片机中都是定义的意思,在应用中怎么区分,谢 ...
define 只是定义一个名称,比如你叫小亮,那么:define NAME 小亮 以后代码中,凡是出现‘NAME’的地方,都会被替换成 ‘小亮’。在编译上看,#define只是告诉编译器 ‘一个名称替换’, 编译器不会为其分配内存空间,即使你定义了一个#define,然后在代码中没有使用,编译器也不会给出任何警告。相...
单片机编程:#define FOSC 1843200L是什么意思?#define是怎么用的?
可以在编译的时候通过#define设置编译环境 5.如何定义宏、取消宏 \/\/定义宏 define [MacroName] [MacroValue]\/\/取消宏 undef [MacroName]普通宏 define PI (3.1415926)带参数的宏 define max(a,b) ((a)>(b)? (a),(b))关键是十分容易产生错误,包括机器和人理解上的差异等等。6.条件编译 i...
C语言宏定义#define的理解与资料整理!希望你能get到!
深入理解C语言中的宏定义,提升代码效率与可读性!一、宏定义的明智运用 尽管#define在C语言中提供便捷,但需谨慎使用。对于数值,建议优先使用const以强化类型检查,如SEC_A_YEAR(60*60*24*365 UL),避免潜在的溢出问题,确保无符号整数的正确表示。二、字符串宏的特殊规则 处理字符串宏时,务必注意...
typedef和#define 的区别
5. typedef和#define在使用时也有不同的注意事项,typedef定义的类型别名可以被其他程序员理解为该类型,而#define定义的宏则需要程序员理解其背后的含义,否则可能会导致代码难以阅读和理解。6. 由于#define定义的宏只是简单的字符替换,因此在使用时需要注意避免宏定义之间的冲突,例如:#define PI 3.14...
#define a #define a 1 两者什么区别 书上都没说着两者的区别啦,苦恼...
if defined(WINDOWS)xxx \/\/do something else xxx endif 从上面的例子可以看出,#define a,相当于自定义了一个条件分支,用于不同情况的处理 2.#define a 1 一般的宏定义,相当于使用a来代替1 以后程序中所有出现a的地方都会用1来代替 比如,int aa = a;就相当于int aa = 1;如果还不理解,...