繁体   English   中英

函数和结构在c ++中具有相同的名称

[英]Function and struct having the same name in c++

以下代码在C ++中编译

struct foo
{
    int a, b;
};

struct foo foo()
{
    struct foo a;
    return a;
}

int main(void) {
    foo();
    return 0;
}
  1. 它应该被允许具有结构和具有相同名称的函数吗?
  2. 因为它编译我然后继续尝试声明类型为foo的对象。 有办法吗? 似乎不可能做到:

     foo a; // error: expected ';' before 'a' foo a{}; // error: expected ';' before 'a' foo a(); // most vexing parse would kick in any way 

是的,这是允许的,我们可以通过草拟C ++标准部分3.3.10 名称隐藏2段并且它说( 强调我的 ):

类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏。 如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见

在这种情况下,在声明中使用struct将解决您的问题:

struct foo a;

通常是做这样的事情的坏习惯。 我将它命名为foo_s或其他任何区别于函数。 除此之外,没有办法实现这一目标。

在C中,这是可能的,因为它需要

struct foo

而不仅仅是

FOO

作为类型名称(除非是typedef)

就像在C中一样,使用:

struct foo a;

您甚至可以像这样初始化它:

struct foo a{};
struct foo a = {0};

解决方法是使用typedef,从而避免任何歧义和其他困难:

typedef struct foo s_foo;

是的,你可以,但这是一个非常糟糕的模式。

struct foo
{
};

foo foo(foo& f)
{
    return f;
}

int main()
{
    struct foo f;
    foo(f);
    return 0;
}

请参阅livedemo: http ://ideone.com/kRK19f

诀窍是在我们想要获得类型时指定struct foo 请注意,在您创建此歧义之前,实际上没有必要继续说struct ,这不是C(如行foo foo(foo& f) )。

大多数开发人员选择驼峰套管图案,例如,他们使用大写字母来区分类型名称和函数名称的小写字母:

struct Foo
{
};

Foo foo(); // no ambiguity.

回到微软的鼎盛时期,许多Windows开发人员习惯于为结构/类定义添加前缀,如果你愿意的话,定义一类东西,用大写字母C

struct CFoo
{
};

现在,即使你想为你的函数名使用大写的第一个字母,也没有歧义。

来自The.C ++。Programming.Language.Special.Edition $ A.8:

为了保持C兼容性,可以在同一范围内声明一个类和一个同名的非类($ 5.7)。 例如:

struct stat { /* ... */ };
int stat(char * name, struct stat * buf);

在这种情况下,普通名称(stat)是非类的名称。 必须使用类键前缀引用该类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM