本文将分享typedef和define区别,C语言typedef和define的区别详解的详细内容,并且还将对typedef跟define进行详尽解释,此外,我们还将为大家带来关于#define与ty
本文将分享typedef和define区别,C语言typedef和define的区别详解的详细内容,并且还将对typedef跟define进行详尽解释,此外,我们还将为大家带来关于#define与typedef、#ifndef和#define的区别、2——PHP defined函数 ill defined be defined by already defined、C ++为什么typedef结构与typedef原语相比是唯一的的相关知识,希望对你有所帮助。
本文目录一览:- typedef和define区别,C语言typedef和define的区别详解(typedef跟define)
- #define与typedef
- #ifndef和#define的区别
- 2——PHP defined函数 ill defined be defined by already defined
- C ++为什么typedef结构与typedef原语相比是唯一的
typedef和define区别,C语言typedef和define的区别详解(typedef跟define)
typedef 是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换。它的新名字具有一定的封装性,所以新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。而 #define 只是简单的字符串替换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。因此,它不会做正确性检查,不管含义是否正确它照样会带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
接下来看下面的示例代码:
typedef char * PCHAR1;
#define PCHAR2 char *……
/* c1、c2 都为char *,typedef为char *引入了一个新的别名*/
PCHAR1 c1,c2;
/*相当于char * c3, c4;c3是char *,而c4是char */
PCHAR2 c3,c4;
#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的一个弊端,就是不能对连续的变量进行重命名,因此尤其是在写宏去操作函数的时候,对每一个变量都切记要加上括号,以防出现如上的漏洞导致计算错误。
#ifndef和#define的区别
#ifndef和#define的区别
一、使用场景不同:
#ifndef使用场景为:
1、头文件中使用,防止头文件被多重调用。
2、作为测试使用,省去注释代码的麻烦。
3、作为不同角色或者场景的判断使用。
#define使用场景:
宏定义
二、含义不同:
#ifndef表示ifnotdefine。
#define表示define。
扩展资料:
#ifndef起到的效果是防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件。
而编译时,这两个C文件要一同编译成一个可运行文件。
把头文件的内容都放在#ifndef和#endif中。不管头文件会不会被多个文件引用,都要加上这个。
一般格式是这样的:
#ifndef <标识> #define <标识>. ........... #endif<标识>
在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。
标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:
#ifndef_STDIO_H_#define_STDIO_H_......#endif.
推荐学习:c语言视频教程
以上就是#ifndef和#define的区别的详细内容,更多请关注php中文网其它相关文章!
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 ++为什么typedef结构与typedef原语相比是唯一的
struct {std::string str;}
这定义了没有名称的类型。
std::string
此命名类型。
typedef TYPE name;
这将为类型name
创建一个别名TYPE
。
在struct{}
情况下,它为在该行上创建的其他未命名类型提供了一个名称。
在std::string
情况下,它为已经命名的事物命名一个别名。
因此,在一种情况下,您创建了2种类型。 typedef
只给他们起了名字。
template<class T,class Tag>
struct strong:T{
using T::T;
};
这是一个相当不错的强类型定义。
远离完美,但还不错。
struct tagA;
struct tagB;
using StringEventA=strong<std::string,tagA>;
using StringEventB=strong<std::stings,tagB>;
标签可以包含很多东西,而不仅仅是结构。
template<class T,auto Tag>
struct strong:T{
using T::T;
};
现在标记是任何编译时间值。
using StringEventA=strong<std::string,'A'>;
using StringEventB=strong<std::stings,'B'>;
例如char
文字。
您的编译器可能不支持auto
模板参数。检查。
为什么将
typedef
的结构视为唯一类型,而将typedef
的{{1}}或其他原语视为唯一类型呢?
std::string
定义类型的别名。它没有定义新类型。
线条
typedef
等同于
typedef struct {std::string str;} StringEventA;
typedef struct {std::string str;} StringEventB;
用于定义struct AnonymousStruct1 {std::string str;};
typedef AnonymousStruct1 StringEventA;
struct AnonymousStruct2 {std::string str;};
typedef AnonymousStruct2 StringEventB;
的匿名struct
的使用不是同一类型,即使它们是相同的单词。
虽然其他答案很好地解释了该理论,但实际上并不需要加上措辞。但是偶尔有些人仍然希望看到经过验证的代码以获取见识。因此,我为g ++写了一个小代码,演示了这里发生的事情(online demo):
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
// Helper function for the raw char pointer gymnastics needed with __cxa_demangle
template<typename T> std::string get_typename() {
char* type_name;
int status;
std::string result;
type_name = abi::__cxa_demangle(typeid(T).name(),&status);
result = std::string(type_name);
free(type_name);
return result;
}
// These are considered to be the same thing
typedef std::string StringEvent1;
typedef std::string StringEvent2;
// While these are considered to be different things
typedef struct {std::string str;} StringEvent3;
typedef struct {std::string str;} StringEvent4;
int main() {
std::cout << "Name of StringEvent1: " << get_typename<StringEvent1>() << std::endl;
std::cout << "Name of StringEvent2: " << get_typename<StringEvent2>() << std::endl;
std::cout << "Name of StringEvent3: " << get_typename<StringEvent3>() << std::endl;
std::cout << "Name of StringEvent4: " << get_typename<StringEvent4>() << std::endl;
}
输出:
Name of StringEvent1: std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> >
Name of StringEvent2: std::__cxx11::basic_string<char,std::allocator<char> >
Name of StringEvent3: StringEvent3
Name of StringEvent4: StringEvent4
因此,我们可以清楚地看到编译器认为什么相同或不同的原因。
以上代码使用typeid()
运算符获取有关(基础)类型的信息,并使用特定于编译器的abi::__cxa_demangle()
函数将其转换为人类可读的格式。
没关系,是否使用typeedef
;当您使用struct
声明时;
struct A {};
struct B {};
typedef struct {std::string str;} StringEventA;
typedef struct {std::string str;} StringEventB;
两者都是不同的类型。
std::string
已经定义的类型,可以容纳不同的值,但是类型始终相同;只是您有两个std::string
类型的别名
关于typedef和define区别,C语言typedef和define的区别详解和typedef跟define的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于#define与typedef、#ifndef和#define的区别、2——PHP defined函数 ill defined be defined by already defined、C ++为什么typedef结构与typedef原语相比是唯一的等相关内容,可以在本站寻找。
本文标签: