Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预期的'';或'';数字常量之前_C++_C - Fatal编程技术网

C++ 预期的'';或'';数字常量之前

C++ 预期的'';或'';数字常量之前,c++,c,C++,C,我是C编程新手,正在尝试解决遇到的一些问题。 当我写 #define N 5 void Sort(int *const array, int N); 编译器在数值常量之前给了我消息“Expected”,“or”“…”。在互联网上搜索后发现问题可能是由#define被调试为数值引起的。我没有使用常数N的#define,因此通过了编译器。但是,我想知道应该如何修改上面的两行,以避免收到错误消息 您正在使用预处理器,它在编译器看到程序的原始文本之前运行。因此,在这种情况下,所有出现的N(当N本身

我是C编程新手,正在尝试解决遇到的一些问题。 当我写

#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++,固定。“莎莎,我不是想指出他的问题是无效的。谢谢大家的解释。他说,它很丑陋,但有时你别无选择: