C++ 编译差异C和C++;
我有一段代码,看起来像C++ 编译差异C和C++;,c++,c,compilation,C++,C,Compilation,我有一段代码,看起来像 #include <stdio.h> #include <netdb.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { struct hostent *server; server = gethostbyname(argv[1]); struct in_addr * address=(in_addr * )server->h_add
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct hostent *server;
server = gethostbyname(argv[1]);
struct in_addr * address=(in_addr * )server->h_addr;
fprintf(stderr,"[%d] [%s] server [%s] \n",__LINE__,__func__,inet_ntoa(*address));
}
我在这里遗漏了什么吗?你应该在_addr中使用
结构,而不仅仅是在_addr
中使用,在c
代码中(也在施法时)。更改:
struct in_addr * address=(in_addr * )server->h_addr;
致:
也,C++(C99之前)只允许在块的顶部声明变量,而<代码>结构> InAdDR*地址不是。
< P> C和C++对结构类型有不同的规则;在C++中,关键字<代码>结构> <代码>创建一个类类型,默认情况下所有成员都是<代码>公共< /代码>。与C不同,此类型名称可以独立存在
C++不仅仅是C的超集,还有大量代码将作为一个而不是另一个进行编译,或者由于语义不同而表现出不同的行为 需要注意的是,C有多个名称空间。通用名称空间
包括typedef和其他标识符,但有一个单独的名称空间用于
结构、枚举和联合标记;另一个用于标签,也用于每个结构
有自己的名称空间。在这样的代码中:
struct name {
int name;
} name;
name
表示3种完全不同的含义,这是完全合法的。到
避免键入struct
关键字,程序员通常为其键入新名称
结构及其标记:
typedef struct name {
int name;
} my_struct;
my_struct s1; /* easier than: struct name s1 */
my_struct s2;
在最后一个示例中,名称甚至可以省略,除非您想使用
指向自身内部结构的指针。这种做法在C++中是如此普遍。
编译器将标记视为结构的定义类型。这是完美的
C++中的法律:
struct my_struct {
int name;
};
my_struct s1;
my_struct s2;
事实上,这就是你们节目中发生的事情。您正在使用struct标记作为
一种类型,但它只是C++中的一种有效类型。你有两个选择:
1.在结构声明中键入def
2.使用struct
关键字引用结构类型
第一个不适用,因为您没有声明结构。信息技术
已经是这样了。所以我还是用第二个。struct in_addr*address=(struct in_addr*)server->h_addr代码> @蝉:我明白了,但是为什么G++是有效的编译?C和C++不是同一种语言,为什么你甚至期望它能在盒子里工作?当我去中国和“早上好”问候人们时,我的样子是空白的…但它在南非非常有效。我是否丢失了什么东西?在C++中,两个不同的命名空间仍然存在并且是分开的。不同之处在于查找,对于每个作用域,编译器将首先在C中检查通用标识符空间,如果失败,它还将在用户定义的类型标识符空间中查找。检查例子:或者感谢评论“DavIDRODR”Guez DeReBeas,我必须承认我的C++知识很差。我稍微修改了一下答案。只是确认:结构标签和新类型同名的Type Debug版本在C++中是完全有效的,对吗?我不确定你的确切意思,但是这是可以的:<代码> TyPuff结构{}};结构B{}代码>虽然令人困惑。在这种情况下,B
指的是第一种类型,struct B
指的是第二种类型。@DavidRodríguez dribeas我指的是我在答案中发布的“第一种选择”,更多的是在typedef struct A{}A代码>。但你的评论回答了这个问题。谢谢
typedef struct name {
int name;
} my_struct;
my_struct s1; /* easier than: struct name s1 */
my_struct s2;
struct my_struct {
int name;
};
my_struct s1;
my_struct s2;
typedef struct in_addr {
/* ... */
} in_addr;
(struct in_addr *)