Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++ gcc内部符号装饰有什么问题?_C++_Gcc_Compiler Warnings - Fatal编程技术网

C++ gcc内部符号装饰有什么问题?

C++ gcc内部符号装饰有什么问题?,c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings,为什么重新定义了\u ZN6myname3varE 初始化并声明为“extern”[默认启用]的警告“u ZN6myname3varE”是什么意思 如果程序在保留名称的上下文中声明或定义名称,而不是本子句明确允许的名称,则该行为是未定义的 17.4.3.1.2全局名称 每个名称都包含一个双下划线(u)或以下划线后跟大写字母开头 字母(2.11)保留给执行机构,以供任何使用 为什么重新定义了\u ZN6myname3varE > C++变量>代码>:MyA::var >代码> GCC。您还定义

为什么重新定义了
\u ZN6myname3varE
初始化并声明为“extern”[默认启用]的警告“u ZN6myname3varE”是什么意思


如果程序在保留名称的上下文中声明或定义名称,而不是本子句明确允许的名称,则该行为是未定义的

17.4.3.1.2全局名称
每个名称都包含一个双下划线(u)或以下划线后跟大写字母开头 字母(2.11)保留给执行机构,以供任何使用

为什么重新定义了
\u ZN6myname3varE

<> > C++变量>代码>:MyA::var >代码> GCC。您还定义了一个名为
\u ZN6myname3varE
的C(即未损坏)变量。因此,同一符号有多个定义


警告[…]是什么意思

标准用法是:

foo.h

Jim@ubuntu:~/workspace/vi_edit$ g++ testSymble.cpp -o testSymble
testSymble.cpp:7:19: warning: ‘_ZN6myname3varE’ initialized and declared ‘extern’ [enabled by default]
testSymble.cpp: In function ‘int main()’:
testSymble.cpp:10:32: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]
/tmp/cczIjRfH.s: Assembler messages:
/tmp/cczIjRfH.s:14: Error: symbol `_ZN6myname3varE' is already defined
foo.c/cc

extern "C" int myvariable;
< >我不确定C++标准是否允许初始化<代码>外部“C”< /C>变量(即,像你正在做的)。但是编译器肯定在警告您,您所做的可能没有意义

为什么重新定义了
\u ZN6myname3varE

<> > C++变量>代码>:MyA::var >代码> GCC。您还定义了一个名为
\u ZN6myname3varE
的C(即未损坏)变量。因此,同一符号有多个定义


警告[…]是什么意思

标准用法是:

foo.h

Jim@ubuntu:~/workspace/vi_edit$ g++ testSymble.cpp -o testSymble
testSymble.cpp:7:19: warning: ‘_ZN6myname3varE’ initialized and declared ‘extern’ [enabled by default]
testSymble.cpp: In function ‘int main()’:
testSymble.cpp:10:32: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]
/tmp/cczIjRfH.s: Assembler messages:
/tmp/cczIjRfH.s:14: Error: symbol `_ZN6myname3varE' is already defined
foo.c/cc

extern "C" int myvariable;

< >我不确定C++标准是否允许初始化<代码>外部“C”< /C>变量(即,像你正在做的)。但是编译器肯定在警告您,您所做的可能没有意义。

第一条警告消息意味着,如果在变量声明中包含
extern
,则不能同时包含初始值设定项。因此,这两行代码都会生成警告:

#include "foo.h"

int myvariable = 42;
你可以写:

extern "C" int i = 9;
extern     int j = 10;
或:

或者(如a中所指出的),可以在行中包含大括号以允许初始值设定项:

extern "C" int i;
extern     int j;
应用于代码时,不能将初始值设定项
=42
放在
extern“C”
行中,或者需要编写:

extern "C" { int i = 9; }
在孤立的情况下,忽略最后一个问题,这应该“起作用”

第二个警告意味着
namespace myname{double var=42;}
double
,因此
%d
转换规范是错误的;它应该是
%f
%e
%g
或此主题的变体

extern "C" { double _ZN6myname3varE = 10.0; }
第三条消息,错误,来自汇编程序。因为第一条消息只是一个警告,所以实际上您有两个不同的定义,当它们被破坏时,使用两个不同的初始值设定项转换为
\u ZN6myname3varE
。您只能使用一个定义-一个定义规则


但是,以下划线开头,后跟大写字母的名称是为实现保留的,因此通过尝试直接使用名称
\u ZN6myname3varE
,您正在调用未定义的行为。不要乱搞未定义的行为;避免它。

第一条警告消息意味着如果在变量声明中包含
extern
,则不能同时包含初始值设定项。因此,这两行代码都会生成警告:

#include "foo.h"

int myvariable = 42;
你可以写:

extern "C" int i = 9;
extern     int j = 10;
或:

或者(如a中所指出的),可以在行中包含大括号以允许初始值设定项:

extern "C" int i;
extern     int j;
应用于代码时,不能将初始值设定项
=42
放在
extern“C”
行中,或者需要编写:

extern "C" { int i = 9; }
在孤立的情况下,忽略最后一个问题,这应该“起作用”

第二个警告意味着
namespace myname{double var=42;}
double
,因此
%d
转换规范是错误的;它应该是
%f
%e
%g
或此主题的变体

extern "C" { double _ZN6myname3varE = 10.0; }
第三条消息,错误,来自汇编程序。因为第一条消息只是一个警告,所以实际上您有两个不同的定义,当它们被破坏时,使用两个不同的初始值设定项转换为
\u ZN6myname3varE
。您只能使用一个定义-一个定义规则


但是,以下划线开头,后跟大写字母的名称是为实现保留的,因此通过尝试直接使用名称
\u ZN6myname3varE
,您正在调用未定义的行为。不要乱搞未定义的行为;避免它。

警告部分呢?@Zack这是因为初始化
extern
变量没有意义。初始化extern变量时,与定义新变量相同。我可以这么说吗?像
extern“C”intx
始终被视为一种声明,而像
extern“C”{int x;}
这样的括号内链接规范可以是一种声明或定义。由于初始值设定项只能出现在定义中,因此必须使用大括号括起来的规范来定义和初始化带有C链接的全局变量(C++03 7.5/7)。那么警告部分呢?@Zack这是因为初始化
extern
变量没有意义。初始化extern变量时,这与定义一个新的相同。我可以这么说吗?像
extern“C”intx
始终被视为一种声明,而像
extern“C”{int x;}
这样的括号内链接规范可以是一种声明或定义。由于初始值设定项只能出现在定义中,因此必须使用括号内的规范来定义和初始化带有C链接(C++03 7.5/7)的全局变量。符号名称以