首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    结构体定义 typedef struct 用法详解和用法小结

    事实上,这个东西是从C语言中遗留过来的,typedef可以定义新的复合类型或给现有类型起一个别名,在C语言中,如果你使用 struct xxx { }; 的方法,使用时就必须用 struct...,不同于宏,它不是简单的字符串替换。...简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。...s4; 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字...显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:“OK,有人还会写这样的代码吗?”

    1.3K20

    #define和typedef的用法与区别及面试问题

    三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量 ,到了C++,const...我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的 编译器又做了扩充。...宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变 量的功能。...是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。...简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

    3.1K10

    C语言之预处理命令与用typedef命名已有类型

    宏定义与定义变量不同,只作字符替换,不分配空间;   带参数的宏定义(不只是进行简单的字符串替换,还要进行参数替换) 带参数的宏定义与函数时不同的,主要有以下几点: 函数调用时,先求出实参表达式的值,然后带入形参...简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。...3、typedef与#define的区别   从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,...主张用typedef,因为在早期的许多C 编译器中这条语句是非法的,只是现今的编译器又做了扩充。...: 36,根本原因就在于#define只是简单的字符串替换,应当加个括号“(X*X)”。

    1.6K90

    江哥带你玩转C语言 | 15- 修饰符和预处理指令

    , 并且不和其他文件中同名全局变量共享同一块存储空间, 那么就可以使用static // A文件中的代码 int num; // 和B文件中的num共享 void test(){ printf(...在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。 宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。...10 return 0; } 3)在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。...宏定义只是简单的字符串替换,是在预处理完成的 typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。...如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

    1.1K00

    C语言中的宏定义

    如果我们只是试图找到所有程序中出现的100,那么就会漏掉99。) 3) 、可以帮助避免前后不一致或键盘输入错误。...它仅允许出现在带参数的宏的替换列表中。(一些C程序员将#操作理解为“stringization(字符串化)”;其他人则认为这实在是对英语的滥用。)...接着,预处理器会重新检查替换列表,看它是否包含其他宏的调用(在这个例子中,调用了宏PI)。预处理器会不断重新检查替换列表,直到将所有的宏名字都替换掉为止。...宏定义中圆括号 在我们前面定义的宏的替换列表中有大量的圆括号。确实需要它们吗?答案是绝对需要。如果我们少用几个圆括号,宏可能有时会得到意料之外的——而且是不希望有的结果。...上面提到了两种将宏定义为空的定义方式,看上去一样,实际上只要明白了宏都只是简单的代码替换就知道该如何选择了。 8. 预定义宏 在C语言中预定义了一些有用的宏, 见表预定义宏。

    6.5K10

    告诉你所不知道的typedef

    2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?...,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。...2. typedef & 结构的问题当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?...,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。...,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

    93410

    【C语言笔记】#define与typedef的区别?

    #define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同...typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中...(2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。...variable 'p2',你知道问题出在哪吗?...答案与解析: 是第五行代码p2++出错了。这个问题提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。

    4.6K40

    C++ 新特性学习(三) — Regex库

    C++ STL终于会放点实用的东西了。可喜可贺。 这个,显然是正则表达式库,作为一个强大而又NB的库,我表示对其理解甚少,只能先研究下基本用法,更具体的用法要等实际应用中用到的时候在细看了。...另一个是类模版std::match_results,传进去的类型是类的迭代器 如以下从VC里抄来的 typedef basic_regex regex; typedef basic_regex...返回的类型也是std::sub_match,内容和上面的类似 这里有第二个注意:匹配结果里的数据是共享的,只是指针不同,所以要注意不要随意释放资源。...std::match_results的format函数,这是一个表示筛选匹配项的的东东 具体的嘛,看下面(只是把BOOST里的东西简单翻译以下,没有boost扩展的部分,并且只留下了VC++里tr1包含的功能...接下来std::regex_replace里的format也是传入这种东西,返回的就是替换后的字符串了。

    1.4K10

    iOS学习——#define、const、typedef的区别

    也就是说并不是真正意义上的定义变量,而是用来做文本替换。当程序开始运行时,编译器会先将代码中的MAX全部替换为100,然后再进行编译。...);而const会在编译时被处理 #define宏没有类型,宏不做任何类型检查,不会报编译错误,只是替换;而const常量有具体的类型,会编译检查,会报编译错误 宏能定义一些函数,方法;const不能...double J=PI; //再进行宏替换,又一次分配内存 double j=Pi; //没有内存分配 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数...typedef是类型替换,语句的一种,结尾必须有; define写在方法/函数中则作用域从写的地方开始有效,直至使用#undef(不写此指令则后面一直有效)。...是类型替换,直接参与编译,而define只是简单的文本替换。

    82441

    长文详解:C语言预处理命令

    在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏替换或宏展开。 宏定义是由源程序中的宏定义命令完成的。宏替换是由预处理程序自动完成的。...“字符串”可以是常数、表达式、格式串等。 宏定义用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名。这只是一种简单的文本替换,预处理程序对它不作任何检查。...如有错误,只能在编译已被宏展开后的源程序时发现。 注意理解宏替换中“换”的概念,即在对相关命令或语句的含义和功能作具体分析之前就要进行文本替换。...因为宏定义只是简单的字符串代换,在预处理阶段完成,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能。...为了避免宏替换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。

    3K10

    写给新手们看的编程修养

    15、修改别人程序的修养 16、把相同或近乎相同的代码形成函数和宏 17、表达式中的括号 18、函数参数中的const 19、函数的参数个数 20、函数的返回类型,不要省略 21、goto语句的使用...(指针是一个危险的东西,一定要初始化) char **pstr; /* 一个字符串数组 */ pstr = ( char** ) malloc( 50*sizeof(char*) ); if ( pstr...虽然,我们的编译器会进行优化,会把循环体内的不变的东西拿到循环外面,但是,你相信所有编译器会知道哪些是不变的吗?我觉得编译器不可靠。最好还是自己动手吧。...如果你有一些程序的代码片段很相似,或直接就是一样的,请把他们放在一个函数中。而如果这段代码不多,而且会被经常使用,你还想避免函数调用的开销,那么就把他写成宏吧。...我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。

    1.5K30

    第一个C语言程序(从Hello World开始)

    你可以把它看做一个空箱子,里面可以装任何其他的和它类型一致的值。 result 只是我们给它起的一个名字,当然,可以任意起名。比如叫he,叫xiangzi,都可以(ps:起名要有语义性)。...标识符由我们自己命名的一个特殊标识,用于表示一个变量、函数或其他实体的名称。 例如:前面我们的自定义函数取名为add是为了清晰地表明函数意图。...printf(“XXX占位1 XXX 占位2 XXX占位3”, 替换1, 替换2, 替换3); printf 的第一个参数必须是 字符串 ,这里我们传入了一个字符串字面常量(被双引号包裹)。...例如:整型int的占位符为 %d 。后面的替换参数,会依次替换前面的占位。 printf是一个变长参数函数,只要第一个字符串参数占位符写对了,后面可以加任意多的替换参数。 11....假定 printf 的函数定义写在文件 stdio.h 中,用 #include 命令,可以将文件 stdio.h 的代码复制到我们的代码中。

    61020

    常量和枚举

    在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。...甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,”Hello world” 与 “world” 两个字符串,只存储前面一个。...占的只是代码段而已,大量用宏会导致二进制文件变大 但#define可以使用类型定义,比如 #define MY_INT_CONSTANT ((int)123) const const定义常量从汇编的角度来看...,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝 如果在一个指定单一类里声明常量...相反,define占据更多的内存空间,因为它只是文字替换,导致存在过多的拷贝。当然这一点是对于一般类型的常量来说的。

    53020

    Objective-C 的运行时中最具争议的黑魔法:Method Swizzling

    例如:我们想要在一款 iOS app 中追踪每一个视图控制器被用户呈现了几次: 这可以通过在每个视图控制器的 viewDidAppear: 方法中添加追踪代码来实现,但这样会大量重复的样板代码。...原子操作就是这样一个用于确保代码只会被执行一次的预防措施,就算是在不同的线程中也能确保代码只执行一次。...Selector 是一个在运行时被注册(或映射)的C类型字符串。Selector由编译器产生并且在当类被加载进内存时由运行时自动进行名字和实现的映射。...理解实现原理:只是简单的拷贝粘贴交换方法实现的代码而不去理解实现原理不仅会让 App 很脆弱,并且浪费了学习 Objective-C 运行时的机会。...持续的预防:不管你对你理解 swlzzling 框架,UIKit 或者其他内嵌框架有多自信,一定要记住所有东西在下一个发行版本都可能变得不再好使。

    47010

    预处理指令、typedef、条件编译、多文件代码

    保证宏函数按照预期运行 由于宏函数仅仅是完成替换操作,将参数替换并拼接到替换体的表达式中。而不是先让参数运算得到结果后,再进行运算。因此,为了保证参数不被其他运算符优先级影响,请在参数两边加上括号。...图片 typedef 用于结构 typedef 并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的别名。..."n = %" PRId32 "\n"会被替换为"n = %" "d" "\n",而相邻的字符串将会被拼接为一个字符串,即"n = %d\n"。...在int32_t是整型long的别名的平台下,"n = %" PRId32 "\n"会被替换为"n = %" "ld" "\n",而相邻的字符串将会被拼接为一个字符串,即"n = %ld\n"。...这是因为,重复的代码出现在不同文件中。 我们知道作用域分为两种: 块作用域:定义或声明在代码块内。 文件作用域:定义或声明在代码块外。 这里的定义或声明均在函数外。那么它们的作用域都是文件作用域。

    1.3K00

    预处理指令、typedef、条件编译、多文件代码

    修改后的代码将另存为中间文件或直接输入到编译器。并不会保存到源文件中。所以,预处理器不会改动源文件。...typedef 用于结构 typedef 并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的别名。..."n = %" PRId32 "\n"会被替换为"n = %" "d" "\n",而相邻的字符串将会被拼接为一个字符串,即"n = %d\n"。...在int32_t是整型long的别名的平台下,"n = %" PRId32 "\n"会被替换为"n = %" "ld" "\n",而相邻的字符串将会被拼接为一个字符串,即"n = %ld\n"。...这是因为,重复的代码出现在不同文件中。 我们知道作用域分为两种: 块作用域:定义或声明在代码块内。 文件作用域:定义或声明在代码块外。 这里的定义或声明均在函数外。那么它们的作用域都是文件作用域。

    1.1K40

    C++箴言:理解typename的两个含义

    在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?       ...在模板定义语法中关键字class与typename的作用完全一样。     typename难道仅仅在模板定义中起作用吗?...假设我们有一个函数的模板,它能取得一个 STL-compatible container(STL 兼容容器)中持有的能赋值给 ints 的对象。进一步假设这个函数只是简单地打印它的第二个元素的值。...让我们来看最后一个 typename 的例子,因为它在你看到的真实代码中具有代表性。...一些编译器接受必需 typename 时它却缺失的代码;一些编译器接受不许 typename 时它却存在的代码;还有少数的(通常是老旧的)会拒绝 typename 出现在它必需出现的地方。

    4.7K20
    领券