相关疑难解决方法(0)

在使用g ++编译C++时,'隐藏构造函数'警告是什么意思?

使用以下代码:

#include <stdio.h>


struct my_struct {
        int a;
        int b;
        my_struct();
};

my_struct::my_struct(void)
{
        printf("constructor\n");
}

void my_struct(void)
{
        printf("standard function\n");
}

int main (int argc, char *argv[])
{
        struct my_struct s;
        s.a = 1;
        s.b = 2;

        printf("%d-%d\n", s.a, s.b);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到一个用g ++ -Wshadow main.cpp编译的警告:

main.cpp:15:20: warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
Run Code Online (Sandbox Code Playgroud)

如果void my_struct函数实际上替换了my_struct :: my_struct,那么我可以使用该警告.但似乎并非如此.如果我运行该程序,我得到:

constructor
1-2
Run Code Online (Sandbox Code Playgroud)

知道这个警告意味着什么吗?特别是当我将C头包含在C++代码中时,这非常烦人

c++ g++

5
推荐指数
1
解决办法
984
查看次数

标识符的命名空间如何在 C 中工作?

我知道命名空间在 C++ 中是如何工作的,但我对它们在 C 中的工作方式有点困惑。所以,我对 C 中的命名空间做了一些研究。

首先,ISO/IEC 9899:2018 (C18) 第 6.2.3 节中的相应部分:

6.2.3 标识符的命名空间

1 如果在翻译单元中的任何一点都可以看到多个特定标识符的声明,则句法上下文会消除引用不同实体的用法的歧义。因此,各种类别的标识符都有单独的名称空间,如下所示:

— 标签名称(通过标签声明和使用的语法消除歧义);— 结构、联合和枚举的标签(通过关键字 struct、union 或 enum 的 any(32) 消除歧义);

——结构或工会的成员;每个结构或联合都有一个单独的名称空间用于其成员(通过用于通过 . 或 -> 运算符访问成员的表达式类型消除歧义);

— 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。


32) 标签只有一个命名空间,尽管三个是可能的。

所以这让我对 C 中的术语有了更多的理解,并且似乎通常与 C++ 具有相同的目的。但不幸的是,标准中没有进一步说明名称空间在 C 中的工作方式。

显然,它与共享相同标识符的实体之间的区别有关,并且与 C++ 不同,我们在其中声明命名空间,例如:

namespace ctrl1 
{ 
    int max = 245; 
} 
Run Code Online (Sandbox Code Playgroud)

并使用命名空间,例如:

using namespace ctrl1;
Run Code Online (Sandbox Code Playgroud)

或者

int a = ctrl1::max;
Run Code Online (Sandbox Code Playgroud)

在 C 中,如果使用了相应的标识符,编译器能够自动消除某个对象的某种用法的歧义。如果我错了纠正我。

这是如何运作的?编译器如何知道他是否应该在 C 中使用一个实体而不是另一个实体?


我已经阅读了 c++ 和 c 中的命名空间但问题更侧重于 C++ 并侧重于特定示例的处理。

我还阅读了C中的 …

c entity namespaces identifier

0
推荐指数
1
解决办法
125
查看次数

标签 统计

c ×1

c++ ×1

entity ×1

g++ ×1

identifier ×1

namespaces ×1