C++ 预期的'';或'';数字常量之前
我是C编程新手,正在尝试解决遇到的一些问题。 当我写C++ 预期的'';或'';数字常量之前,c++,c,C++,C,我是C编程新手,正在尝试解决遇到的一些问题。 当我写 #define N 5 void Sort(int *const array, int N); 编译器在数值常量之前给了我消息“Expected”,“or”“…”。在互联网上搜索后发现问题可能是由#define被调试为数值引起的。我没有使用常数N的#define,因此通过了编译器。但是,我想知道应该如何修改上面的两行,以避免收到错误消息 您正在使用预处理器,它在编译器看到程序的原始文本之前运行。因此,在这种情况下,所有出现的N(当N本身
#define N 5
void Sort(int *const array, int N);
编译器在数值常量之前给了我消息“Expected”,“or”“…”。在互联网上搜索后发现问题可能是由#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);
但是,在实际的函数定义中命名它仍然存在问题
请注意,即使只是将字母的大小写(从N
更改为N
)也可以修复它,但不要这样做,因为在某些人看来它可能会模棱两可
C++
如果你使用C++,你不应该使用<代码>定义< /COD>(尽量避免它,因为它们是)。您应该更喜欢
常量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
您可以定义一个宏,该宏在编译器看到代码之前由预处理器展开。因此,编译器得到:
void Sort(int *const array, int 5);
这是无效的C语法。您使用N表示宏,定义n5,定义N表示变量名,
int N
。这是个坏主意。通常的惯例是为宏保留所有大写名称。因此,在本例中,我建议将intn
更改为intn
。避免不小心使用宏,它们正是造成这种问题的原因。但是,如果您确实使用宏,则为它们指定比“N”更有意义的名称,以尽量减少此类错误的发生。对于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
#定义n5
#干扰素
#pragma push_宏(“N”)
#未定义的
#定义重新定义
#恩迪夫
无效排序(int*常量数组,int N);
#ifdef重新定义
#pragma pop_宏(“N”)
#恩迪夫
由于问题被标记为C++,所以建议停止使用<代码>定义> <代码>,以定义常量:
const int N = 5;
int f(int N); // works
如果您被迫使用预处理器,请为宏指定长而难看的名称,以避免名称冲突:
#define YOUR_MEANINGFUL_CONSTANT_NAME_GOES_HERE 5
int f(int N); // works;
考虑你的代码相当于<代码>空洞排序(int *const数组,int 5);<代码>。这是荒谬的。@silico中,有什么特别的原因让你只重新标记到C吗?“这是一个有效的问题,也是两种语言的陷阱。”Jens Gustedt:因为OP说“我是C编程中的新手”。你使用C代码> const 合格变量的想法对于C来说不是一个好主意,而只是C++。这是两种语言有本质区别的地方之一,对于C语言来说,这很容易让您得到多重定义的符号。对于C,可以使用
enum{N=5}代码>这里有一个类似的效果。即使这是一个糟糕的做法,他的问题仍然有效。当您使用没有任何控制权的第三方库时,很可能会发生宏名称冲突。@Jens哦,哇,我是如何进入C部分的?对不起,我想这是C++,固定。“莎莎,我不是想指出他的问题是无效的。谢谢大家的解释。他说,它很丑陋,但有时你别无选择: