为什么#define不需要分号?
我在C中编写了一些测试代码。 我错了,我插了一个;
在#define
,这给了我错误。 为什么#define
s不需要分号?
进一步来说 :
方法1:有效
const int MAX_STRING = 256; int main(void) { char buffer[MAX_STRING]; }
方法2:不起作用 – 编译错误。
#define MAX_STRING 256; int main(void) { char buffer[MAX_STRING]; }
这些代码行为不同的原因是什么? 那些MAX_STRING都不是常量吗?
#define
是一个预处理程序指令 ,而不是C语法定义的语句或声明 (两者都需要以分号结尾)。 每个语法的规则是不同的。
#define MAX_STRING 256;
手段:
每当你在预处理时找到MAX_STRING,用256;
替换它256;
。 在你的情况下,它将使方法2:
#include #include #define MAX_STRING 256; int main(void) { char buffer [256;]; }
这是无效的语法。 更换
#define MAX_STRING 256;
同
#define MAX_STRING 256
两个代码之间的区别在于,在第一种方法中,您声明一个等于256
的常量,但在第二种代码中,您将MAX_STRING
定义为256;
在您的源文件中。
#define指令用于定义预处理器在编译之前操作程序源代码所使用的值或宏。 因为在编译器对源代码执行操作之前替换了预处理程序定义,所以#define引入的任何错误都很难跟踪。
语法是:
#define CONST_NAME VALUE
如果有的话;
最后,它被视为VALUE
的一部分。
要了解#define
的工作原理,请尝试定义:
#define FOREVER for(;;) ... FOREVER { /perform something forever. }
John Hascall的有趣评论:
大多数编译器会为您提供一种在预处理器阶段之后查看输出的方法,这可以帮助调试这样的问题。
在gcc
,可以使用标志-E
来完成。
define
是一个预处理程序指令,并且是一个简单的替换,它不是一个声明。
BTW,作为替代品,它可能包含一些;
作为其中一部分:
// Ugly as hell, but valid #define END_STATEMENT ; int a = 1 END_STATEMENT // preprocessed to -> int a = 1;
两个常数? 没有。
第一种方法不会在C语言中产生常量 。 Const限定变量不符合C中的常量。第一种方法的作用只是因为past-C99 C编译器支持可变长度数组(VLA)。 在第一种情况下,您的buffer
是VLA,特别是因为MAX_STRING
不是常量。 尝试在文件范围内声明相同的数组,您将收到错误,因为文件范围中不允许使用VLA。
第二种方法可用于将名称分配给C中的常量值,但您必须正确执行。 的;
在宏定义中不应该存在。 宏通过文本替换工作,你不想替换额外的;
进入你的数组声明。 定义该宏的正确方法是
#define MAX_STRING 256
在C语言中,当涉及到定义正确的命名常量时,基本上只限于宏和枚举。 不要试图使用const
“常量”,除非你真的知道它将适用于你的目的。
就语言而言,第二个版本没有定义常量,只是一个文本块的替换规则。 一旦预处理器完成了它的工作, 编译器就会看到
char buffer [256;];
这在语法上是无效的。
故事的寓意:更喜欢const int MAX_STRING = 256;
这样可以帮助您,编译器和调试器。
因为这是预编译器指令的语法决定方式。
只有声明以a结尾;
在c / c ++中,# #define
是一个预处理器指令而不是语句 。
这个预处理器指令:
#define MAX_STRING 256;
告诉预处理MAX_STRING
256;
替换所有MAX_STRING
256;
– 和分号 。 预处理程序语句最后不需要分号。 如果你放一个,预处理器实际上认为你的意思是分号。
如果你对常量的#define
s感到困惑,那么const int
可能更容易理解。
如果您想了解有关如何正确使用这些预处理程序指令的更多信息,请尝试查看此网站。