本文将介绍define、const、typedef的差别(转)的详细情况,特别是关于define和const区别的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将
本文将介绍define、const、typedef的差别(转)的详细情况,特别是关于define和const区别的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于#define与typedef、13、TypeScript 之联合类型 - unionType、null、undefined、2——PHP defined函数 ill defined be defined by already defined、c – const TypedeffedIntPointer不等于const int *的知识。
本文目录一览:- define、const、typedef的差别(转)(define和const区别)
- #define与typedef
- 13、TypeScript 之联合类型 - unionType、null、undefined
- 2——PHP defined函数 ill defined be defined by already defined
- c – const TypedeffedIntPointer不等于const int *
define、const、typedef的差别(转)(define和const区别)
#define 并不是定义变量啊 #define 只是用来做文本替换的 例如: #define Pi 3.1415926 float angel; angel=30*Pi/180; 那么,当程序进行编译的时候,编译器会首先将 “#define Pi 3.1415926”以后的,所有代码中的“Pi”全部换成 “3.1415926” 然后再进行编译。 我查到一个讲const与#define的差别的帖子,里面谈到const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在并可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。 const常量存在于程序的数据段,#define常量存在于程序的代码段。 至于两者的优缺点,要看具体的情况了。一般的常数应用,笔者个人认为#define是一个更好的选择: i.从run-time的角度来看,他在空间上和时间上都有很好优势。 ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并(在上例中T*10将被0x82取代)。 但是:如果你需要粗鲁的修改常数的值,那就得使用const了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。 1.简单的define定义 程序中遇到MAXTIME就会当作1000来处理.
2.define的“函数定义
”
define 可以像函数那样接受一些参数,如下 #define max(x,y) (x)>(y)?(x):(y); 这个定义就将返回两个数中较大的那个,看到了吗?因为这个 “ 函数 ” 没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。 但是这样做的话存在隐患 ,例子如下: #define Add(a,b) a+b; 在一般使用的时候是没有问题的,但是如果遇到如: c * Add(a,b) * d 的时候就会出现问题,代数式的本意是 a+b 然后去和 c , d 相乘,但是因为使用了 define (它只是一个简单的替换),所以式子实际上变成了 c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是 a 和 b 都是 int 型指针,但是实际上变成 int* a,b; a 是 int 型指针,而 b 是 int 型变量。 这时应该使用 typedef 来代替 define ,这样 a 和 b 就都是 int 型指针了。 所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。 3. 宏的单行定义 #define A(x) T_##x #define B ( x ) #@x #define C ( x ) #x 我们假设: x=1 ,则有: A(1)------ ) T_1 B(1)------ ) '1' C(1)------ ) "1" 4.define 的多行定义 define 可以替代多行的代码,例如 MFC 中的宏定义(非常的经典,虽然让人看了恶心) #define MACRO(arg1,arg2) do { / /* declarations */ / stmt1; / stmt2; / /* ... */ / } while(0) /* (no trailing ; ) */ 关键是要在每一个换行的时候加上一个 "/" 摘抄自 http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个 bug 5. 在大规模的开发过程中,特别是跨平台和系统的软件里,define 最重要的功能是条件编译 就是: #ifdef WINDOWS ...... ...... #endif #ifdef LINUX ...... ...... #endif 可以在编译的时候通过 #define 设置编译环境 6. 如何定义宏、取消宏 // 定义宏 #define [MacroName] [Macrovalue] // 取消宏 #undef [MacroName] 普通宏 #define PI (3.1415926) 带参数的宏 #define max(a,b) ((a)>(b)? (a),(b)) 关键是十分容易产生错误,包括机器和人理解上的差异等等。 7. 条件编译 #ifdef XXX…(#else) …#endif 例如 #ifdef DV22_AUX_INPUT #define AUX_MODE 3 #else #define AUY_MODE 3 # endif #ifndef XXX … (#else) … #endif 8. 头文件(.h)可以被头文件或C文件包含 重复包含(重复定义) 由于头文件包含可以嵌套,那么 C 文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义) 例如 #ifndef __headerfileXXX__ # define __headerfileXXX__ … 文件内容 … #endif 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像: #define INT int 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。 宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行: typedef (int*) pINT; 效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a,b; 表示定义了一个整型指针变量a和整型变量b。 |
#define与typedef
一丶typedef
typedef根据名字就知道是对类的定义。但是值得注意的是,它并不定义新的类型,而是对已有的类型定义一个其他的名字。typedef可以隐藏笨拙的语法结构以及平台相关的数据类型,从而增加可移植性及未来的可维护性。一般格式为:
typedef datatype typename;
typedef还可以掩盖复合类型,例如指针、数组、函数指针。 typedef可以增强程序的可读性,以及标识符的灵活性,但是它也有“非直观性”等缺点。
二丶#define
#define为一个宏定义语句,通常它用来定义常量(包括无参量与带参量),以及用来实现那些长串的宏。它本身并不在编译过程中进行,而是在预处理过程就完成了,但因此难以发现潜在的错误及其他代码维护问题。一般格式为:
#define typename datatype
#define dataname data
#define functionname(data1,data2) function()
例如写一个宏求两数中最小的:
#define MIN(a,b) ((a) > (b) ? (b) : (a)) //注意此处与typedef的区别,末尾没有;
而对于两者区别举一个最直观的例子如下:
#define INT1 int;
typedef int INT2
INT1 A,B;
INT2 C,D;
此时可以看出我们对int这一类型进行了重名操作,A,B,C,D四个变量都是int类型的,而事实并非如此。
对于C,D变量二者确实都是int类型,等价于int C,int D;但对于A,B变量,只有A是int型,而B则就是单独一个B。INT1 A,B等价于int a,b;
从这里我们也可以看出使用#define的一个弊端,就是不能对连续的变量进行重命名,因此尤其是在写宏去操作函数的时候,对每一个变量都切记要加上括号,以防出现如上的漏洞导致计算错误。
13、TypeScript 之联合类型 - unionType、null、undefined
所谓联合类型就是指:可以指定多种数据类型,扩大数据类型范围。
let data: string | number | boolean...
TS并不推荐使用
null 和 undefined 是所有类型的子集 有些情况 即使你定义参数类型 传入 null 或者 undefined 也不会报错的
当你 去编译 TS 文件 加上后缀 --strictNullChecks
比如这样tsc filesName.ts --strictNullChecks
var func = function (value: number | string) {
var type = typeof value;
if (typeof value === "number") {
return "your number is " + value;
}
else if (typeof value === "string") {
return "your name is " + value;
}
};
var result = func(null);
意思为类型“null”的参数不能赋值给类型 “string | number” 的参数
当然想解决此类问题 只需要在参数加上 null 和 undefined 即可
2——PHP defined函数 ill defined be defined by already defined
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhello * 完成日期:2016年5月18日 * 版本号:V1.0 * 问题描述:PHP * 程序输入:无 * 程序输出:无 */ <?php define("PI1",3.14); $p = "PI1"; $is1 = defined($p); $is2 = defined("PI2"); var_dump($is1); var_dump($is2); ?>
defined()函数可以帮助我们判断一个常量是否已经定义,其语法格式为:
bool defined(string constants_name
若存在则返回布尔类型true,否则返回布尔类型false; (注:bool表示函数返回值类型为布尔类型)以上就介绍了2——PHP defined函数,包括了defined方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
c – const TypedeffedIntPointer不等于const int *
typedef int* IntPtr; const int* cip = new int; const IntPtr ctip4 = cip;
我用Visual Studio 2008编译它并得到以下错误:
error C2440: ‘initializing’ : cannot convert from ‘const int *’ to ‘const IntPtr’
显然,我对typedef的理解不是应该的.
我问的原因是,我将指针类型存储在STL映射中.我有一个函数返回一个const指针,我想用它在地图中搜索(使用map :: find(const key_type&)).
const MyType*
和
const map<MyType*,somedata>::key_type
是不相容的,我有问题.
问候
短剑
解决方法
您需要将cip的声明/初始化更改为
int * const cip = new int;
要在您的示例中解决此问题,您需要将映射的键类型更改为const MyType *(是否有意义取决于您的应用程序,但我认为通过用作键的指针更改MyType对象地图不太可能),或者回到const_casting参数来查找:
#include <map> int main() { const int * cpi = some_func(); std::map<const int *,int> const_int_ptr_map; const_int_ptr_map.find(cpi); //ok std::map<int *,int> int_ptr_map; int_ptr_map.find(const_cast<int *>(cpi)); //ok }
我们今天的关于define、const、typedef的差别(转)和define和const区别的分享已经告一段落,感谢您的关注,如果您想了解更多关于#define与typedef、13、TypeScript 之联合类型 - unionType、null、undefined、2——PHP defined函数 ill defined be defined by already defined、c – const TypedeffedIntPointer不等于const int *的相关信息,请在本站查询。
本文标签: