预期的"",""或"..."在数字常量之前

Expected ',' or '...' before numeric const

本文关键字:常量 数字      更新时间:2023-10-16

我是C编程的新手,试图找出遇到的一些问题。当我写

#define N 5
void Sort(int *const array,  int N);

编译器告诉我"Expected ", " or "…"' before numeric const '。在网上搜索后,发现这个问题可能是由于#define被调试为数值引起的。我确实通过不使用常数n的#define通过编译器。但是,我想知道我应该如何修改上面的两行,这样我就不会得到那个错误消息?

您正在使用预处理器,它在编译器看到程序的原始文本之前运行。所以在这种情况下,所有出现的N(当N单独存在时,而不是另一个单词的一部分)都被5取代。由于预处理器的原因,当程序到达编译器时,它所看到的只是:

void Sort(int *const array,  int 5);

这是无效的语法,这就是为什么你得到错误。


C或c++

#define使用不同的名称,或者将参数名称更改为任何其他有效的标识符。后者看起来像这样:

#define N 5
void Sort(int *const array,  int number);

另一个选择是在函数原型中不使用变量名:

#define N 5
void Sort(int *const, int);

但是你仍然有在实际函数定义中命名它的问题。

请注意,即使只是改变字母的大小写(从Nn)也会修复它,但不要这样做,因为它可能会让人看起来模棱两可。


c++

如果你正在使用c++,你不应该使用#define(尽可能避免使用它,因为它们在很多方面都是不好的)。您应该选择const int:

const int N = 5;

你可以在任何你可以使用另一个的地方使用这个,而且当人们试图为自己使用那个名字时它不会中断,并且它不会像在C中那样导致多个定义(谢谢Jens)。例如,如果您使用常数而不是#define:

,您的原始代码将正常工作。
const int N = 5;
void Sort(int *const array,  int N); // works because N is a real variable

#define一个宏,它在编译器看到代码之前由预处理器展开。编译器得到:

void Sort(int *const array, int 5);

既然这个问题被标记为c++,我建议停止使用#define来定义常量:

const int N = 5;
int f(int N); // works

如果你被迫使用预处理器,给你的宏起一个长而难看的名字,以避免名字冲突:

#define YOUR_MEANINGFUL_CONSTANT_NAME_GOES_HERE 5
int f(int N); // works;

您使用N作为宏,#define N 5和N作为变量名称int N。这是个坏主意。通常的约定是为宏保留所有大写的名称。所以在这种情况下,我建议将int N更改为int n。避免粗心地使用宏,它们恰恰会导致这类问题。但是,如果您确实使用宏,请为它们提供比'N'更有意义的名称,以尽量减少此类错误的发生。

对于VS编译器,你可以这样做:

<>之前#define N 5# ifdef N# pragma push_macro("N")# undef N#定义REDEFINE_N# endifvoid Sort(int *const数组,int N);# ifdef REDEFINE_N# pragma pop_macro("N")# endif