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

时间:2011-08-18 06:17:16

标签: c++ c

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

#define N 5

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

编译器在数字const之前给了我“预期','或'...'的消息”。在互联网上搜索后发现问题可能被#define调试为数值。我没有使用#define作为常量N来完成编译器。但是,我想知道我应该如何修改上面两行以便我不会收到该错误消息?

5 个答案:

答案 0 :(得分:12)

你正在使用在编译器看到它之前在程序的原始文本上运行的预处理器。因此,在这种情况下,N的{​​strong>所有次出现(当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(尽可能避免使用它,因为它们是bad in myriad {{3} })。您应该更喜欢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

答案 1 :(得分:1)

#define在编译器看到代码之前由预处理器展开的宏。所以,编译器得到:

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

这不是有效的C语法。

答案 2 :(得分:0)

您使用N代表宏#define N 5,N代表变量名int N。这是一个坏主意。通常的惯例是保留宏的所有大写名称。因此,在这种情况下,我建议将int N更改为int n。避免不小心使用宏,它们会引起这种问题。但是如果你使用宏给它们提供比'N'更有意义的名字,以尽量减少这种错误的可能性。

答案 3 :(得分:0)

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


#define N 5

#ifdef N
    #pragma push_macro("N") 
    #undef N

    #define REDEFINE_N
#endif

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

#ifdef REDEFINE_N
    #pragma pop_macro("N")
#endif 

答案 4 :(得分:0)

由于问题被标记为C ++,我建议停止使用#define来定义常量:

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

如果你被迫使用预处理器,请给你的宏名字留下难看的名字以避免名字冲突:

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