GVKun编程网logo

typedef和define区别,C语言typedef和define的区别详解(typedef跟define)

21

本文将分享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)

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;

在定义上述的变量时,c1、c2 与 c3 按照预期都被定义成 char* 类型。值得注意的是,c4 却被定义成 char 类型,而不是我们所预期的 char*。其根本原因就在于 #define 只是简单的字符串替换,而 typedef 则是为一个类型引入一个新的别名。

#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的一个弊端,就是不能对连续的变量进行重命名,因此尤其是在写宏去操作函数的时候,对每一个变量都切记要加上括号,以防出现如上的漏洞导致计算错误。

#ifndef和#define的区别

#ifndef和#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

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原语相比是唯一的

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原语相比是唯一的等相关内容,可以在本站寻找。

本文标签: