有很多教程和问题可以解决这个问题。但我想在一个具体案例中证实我的理解。下面两个不应该对编译器产生影响,即一个是正确的。对?
typedef _GridLayoutInputRepeater<_num-1,Figure,_types...> _base;
和
#define _base _GridLayoutInputRepeater<_num-1,Figure,_types...>
同样,下面不应该有所区别?
#define INT_32 uint32_t
和
typedef uint32_t INT_32;
编辑:跟进帖子here
答案 0 :(得分:4)
目前没有显示用例,两种情况都是&#34;相等&#34;但你应该注意的是#define
是一个完全不同于typedef
的野兽。
typedef
引入了另一种类型的别名,编译器会看到这个别名,因此会遵循编译规则,范围等等。
一个#define
是一个预处理器宏,预处理器将在实际编译器之前运行,并且实际上会进行文本替换,它不关心作用域或任何语法规则,它非常&#34哑#34;
通常,typedefs
是可行的方式,因为它们不容易出错。在这种情况下,您也可以使用using =
但个人偏好,因为它们都是相同的:
using _base = _GridLayoutInputRepeater<_num-1,Figure,_types...>;
答案 1 :(得分:1)
使用#define
而不是typedef
或using
的问题在于[已经指出] #define
是一个宏,并且宏被评估和扩展预处理器,因此编译器对您尝试创建的数据类型一无所知,因为#define
指令只是替换为它之后的任何内容。
在C和C ++等语言中使用宏的原因是允许与源代码逻辑无关但与源代码结构有关的事情。
例如,#include
指令完全包含文件的全部内容而不是derective。
所以,如果myfile.h
包含:
void func_1(int t);
void func_2(int t);
然后
#inlude "myfile.h"
会扩展myfile.h
的内容,用
#include
预处理程序指令
void func_1(int t);
void func_2(int t);
然后编译器出现并使用类定义和其他扩展宏编译扩展文件!
这就是为什么宏
#pragma once
或
#ifndef __MYFILE_INCLUDE__
#define __MYFILE_INCLUDE__
用于头文件的开头,以防止发生多个定义。
使用像#define INT64 unsigned int
这样的表达式时,预处理器的功能完全相同。它评估表达式,然后用INT64
替换所有出现的unsigned int
。
另一方面,当您使用typedef时,编译器会进行类型替换,这意味着编译器可以警告错误地使用新创建的类型。
#define
会警告您unsigned int
的使用不正确,如果您有很多类型替换可能会让您感到困惑!