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)的全局变量。符号名称以