C++ 函数和结构在c++;

C++ 函数和结构在c++;,c++,C++,下面是C语言中的代码++ 是否应该允许它具有同名的结构和函数 因为它是编译的,所以我接着尝试声明一个foo类型的对象。有办法吗?似乎不可能做到: foo a; // error: expected ‘;’ before ‘a’ foo a{}; // error: expected ‘;’ before ‘a’ foo a(); // most vexing parse would kick in any way 做那样的事通常是不好的习惯。我会把它命名为foo_s或其他任何东西,以区别

下面是C语言中的代码++

  • 是否应该允许它具有同名的结构和函数
  • 因为它是编译的,所以我接着尝试声明一个
    foo
    类型的对象。有办法吗?似乎不可能做到:

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

  • 做那样的事通常是不好的习惯。我会把它命名为foo_s或其他任何东西,以区别于函数。除此之外,真的没有一种方法可以做到这一点

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

    struct foo
    
    而不仅仅是


    作为类型名(除非它是typedef'd)

    只需像在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:

    诀窍是在我们想要获取类型时指定
    struct foo
    。请注意,在创建这种歧义之前,实际上没有必要一直说
    struct
    ,这不是C(如
    foo-foo(foo&f)

    大多数开发人员选择驼峰式大小写模式,例如,他们使用大写字母来区分类型名称,使用小写字母来区分函数名称:

    struct Foo
    {
    };
    
    Foo foo(); // no ambiguity.
    
    早在微软的鼎盛时期,许多Windows开发人员就养成了在结构/类定义前面加上大写字母C的习惯,如果你愿意的话,这是一个类的定义

    struct CFoo
    {
    };
    

    现在,即使您想使用大写首字母作为函数名,也没有歧义。

    是的,这是允许的,我们可以通过转到第3.3.10节名称隐藏第2段看到这一点,它说(我的重点):

    类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量、数据成员、函数或枚举数的名称隐藏如果类或枚举名称以及变量、数据成员、函数或枚举数在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举数名称在何处可见,该类或枚举名称都将隐藏

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

    struct foo a;
    

    < C++ >编程语言.Auto.Edio A.8:< /P> 为了保持C的兼容性,可以在同一个文档中声明同名的类和非类 范围(5.7美元)。例如:

    在本例中,普通名称(stat)是非类的名称。必须使用 类键前缀


    structfoof;世界上有谁会这样做?哦,等等,在这里检查一下
    \u stat
    :我认为一个聪明的
    typedef
    实际上会使事情变得不那么复杂和更可读。@Jeffrey:这是对所选名称的批评,还是更深层次的批评?因为我看不出除了第一个之外,它还能是什么,所以我想一定是我忽略了什么。想澄清一下吗?“不过,它会让事情变得不必要的复杂。”——巧妙地使用
    typedef
    可以让事情变得不那么复杂,更具可读性。
    struct foo a;
    
    struct stat { /* ... */ };
    int stat(char * name, struct stat * buf);