使用以下代码:
#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++ 中是如何工作的,但我对它们在 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中的 …