Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译差异C和C++;_C++_C_Compilation - Fatal编程技术网

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 *)