为什么#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可能更容易理解。

如果您想了解有关如何正确使用这些预处理程序指令的更多信息,请尝试查看此网站。