如果我有:
#define MAXLINE 5000
Run Code Online (Sandbox Code Playgroud)
MAXLINE被理解为什么类型?我应该假设它是一个int?我能以某种方式测试吗?
一般来说,如何确定#defineed变量的类型?
tpg*_*114 47
它没有类型.这是一个简单的文本替换.在MAXLINE作为令牌出现的任何地方,文本5000都将被删除.
例如:
int a = MAXLINE;
Run Code Online (Sandbox Code Playgroud)
将值5000放入a.
而
char *MAXLINE2 = "MAXLINE";
Run Code Online (Sandbox Code Playgroud)
不会导致
char *50002 = "5000";
Run Code Online (Sandbox Code Playgroud)
所以,如果你想要进行类型检查,那么宏不可行.您将需要声明静态常量,这样类型检查由编译器完成.
有关之间差异的信息static,const以及#define,有许多来源,包括这样的问题:静态,定义,和const用C
(非常!)从广义上讲,您的C编译器在执行时将执行3个任务:
对源文件运行预处理传递,
在预处理的源文件上运行编译器
在生成的目标文件上运行链接器.
以a开头#的行,就像行一样
#define MAXLINE 5000
Run Code Online (Sandbox Code Playgroud)
由预处理器阶段处理.(简单地说)预处理器将解析文件并对它检测到的任何宏执行文本替换.预处理器中没有类型的概念.
假设您的源文件中包含以下行:
#define MAXLINE 5000
int someVariable = MAXLINE; // line 2
char someString[] = "MAXLINE"; // line 3
Run Code Online (Sandbox Code Playgroud)
预处理器将检测第MAXLINE2行上的宏,并执行文本替换.请注意,第3行"MAXLINE"不会被视为宏,因为它是字符串文字.
预处理器阶段完成后,编译阶段将只看到以下内容:
int someVariable = 5000; // line 2
char someString[] = "MAXLINE"; // line 3
Run Code Online (Sandbox Code Playgroud)
(为了清楚起见,留下了注释,但通常由预处理器删除)您可以使用编译器上的选项来检查预处理器的输出.在gcc中,该-E选项将执行此操作.
请注意,虽然预处理器没有类型的概念,但没有理由不能在宏中包含类型以保证完整性.例如
#define MAXLINE ((int)5000)
Run Code Online (Sandbox Code Playgroud)
小智 5
编译器永远不会看到那行代码,预处理器在实际编译之前运行,并用它们的文字值替换这些宏,请参阅下面的链接以获取更多信息
http://www.cplusplus.com/doc/tutorial/preprocessor/