GVKun编程网logo

define、const、typedef的差别(转)(define和const区别)

10

本文将介绍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、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了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。

有关#define的用法

1.简单的define定义
#define MAXTIME 1000

程序中遇到MAXTIME就会当作1000来处理.
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写
if(i<MAXTIME){.........}
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

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和#define的用法与区别

一、typedef的用法

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:

typedef    int       INT;
typedef    int       ARRAY[10];
typedef   (int*)    pINT;

typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。

二、#define的用法

#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:

#define   INT             int
#define   TRUE         1
#define   Add(a,b)     ((a)+(b));
#define   Loop_10    for (int i=0; i<10; i++)

在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;
以及下面这行:
#define    pINT2    int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a,b;

表示定义了一个整型指针变量a和整型变量b。

#define与typedef

#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

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);

clipboard.png

意思为类型“null”的参数不能赋值给类型 “string | number” 的参数

当然想解决此类问题 只需要在参数加上 null 和 undefined 即可

2——PHP defined函数 ill defined be defined by already defined

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 *

c – const TypedeffedIntPointer不等于const int *

我有以下C代码:

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

是不相容的,我有问题.

问候
短剑

解决方法

当你编写const IntPtr ctip4时,你声明一个const-pointer-to-int,而const int * cip声明一个指向const-int的指针.这些不一样,因此转换是不可能的.

您需要将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 *的相关信息,请在本站查询。

本文标签: