C++ 枚举指针能否指向常量值?
我正在编写一些代码,其中定义了一个“枚举”来描述错误的类型。 每当调用某个函数时,它都将“枚举指针”作为参数。然后,该函数将使用“常量枚举”值设置传入的错误变量。当我运行程序时,我得到一个运行时错误。我提供了一些代码来描述我的问题:C++ 枚举指针能否指向常量值?,c++,pointers,enums,segmentation-fault,C++,Pointers,Enums,Segmentation Fault,我正在编写一些代码,其中定义了一个“枚举”来描述错误的类型。 每当调用某个函数时,它都将“枚举指针”作为参数。然后,该函数将使用“常量枚举”值设置传入的错误变量。当我运行程序时,我得到一个运行时错误。我提供了一些代码来描述我的问题: enum error { No_Exist=0, No_Error, Unknown, }; bool process_something(..., error *err) { .... .... ....
enum error
{
No_Exist=0,
No_Error,
Unknown,
};
bool process_something(..., error *err)
{
....
....
....
*err = No_Error;
return 1;
}
int main()
{
error *err_val;
if(process_something(...,err_val))
{
.....
.....
}
.....
return (0);
}
我想知道是否可以为指针枚举变量赋值为“No_Error”?现在,如果必须使用正在使用的内容,则应通过引用来完成 比如说,
int readnumber(string userinput, bool* ok);// or your enum instead of a boolean
//
bool okay;
auto val = readstring(someinput,&okay);
if (!okay)
{
cout << "Something weird but we don't want that to crash our program";
}
int readnumber(字符串userinput,bool*ok);//或者使用枚举而不是布尔值
//
布尔好;
auto val=readstring(someinput,&ok);
如果(!好的)
{
cout当您看到以下函数时:
void foo(int*);
这并不意味着您需要传递显式声明的int*
变量。以下是错误用法:
int* p;
foo(p);
以下是正确的,但不正确:
int* p;
int a;
p=&a;
foo(p); // p points to a
以下也是正确的(但同样不正确,IMO):
最正确的用法(根据手头的问题)是:
int a;
foo(&a);
请记住,int*
(或任何T*
)表示向我传递地址,而不是向我传递指针。另一个例子是引用。如果函数类似于:
void bar(int&);
并不意味着您必须声明一个int引用并传递它:
int a;
int &r = a;
bar(r);
而是传递a
本身。函数需要一个引用(L值)。这:
int main()
{
error *err_val;
if(process_something(...,err_val))
应该是:
int main()
{
error err_val;
if(process_something(..., &err_val))
你需要传递一个有效的错误的地址来创建一个指向某个地方的指针process\u something()
可以实际写入。你的代码会触发未定义的行为。你首先需要初始化指向某个地方的指针,error*err\u val;
指向任何地方。更好的是,把它用作一个值(error err\u val;
)或者,换句话说,行*err=No_Error;
可以很好,只是您调用函数的方式是错误的。@n您的意思是,如果我将简单变量作为'Error err',调用函数时将地址作为'&err'传递,则不会有任何分段错误。正确。否则请更改签名重新调用process\u something(…,error&err)
并将其命名为if(process\u something(…,err))
(使用error err=Unknown;
)这对我很有帮助。我明白了。这些“错误”不是“异常”,它们只是用于日志记录目的。枚举是我们在进程之后设置的已定义错误('function'))这是一个解决问题的代码。当你说“不正确的”是指“坏的风格”。在C++中,“不成形”是指“不好形成”(从C++ 11标准引用)是指“根据语法规则、可诊断语义规则和一个定义规则构造的C++程序”。从这个意义上讲,我更喜欢C++,因为它是C++标准给出的一个例子,你给出的例子并不是不正确的。
int main()
{
error err_val;
if(process_something(..., &err_val))