GCC内部符号装饰有什么问题
what is wrong with the gcc internal symbol decoration?
#include <stdio.h>
namespace myname{
double var = 42;
}
extern "C" double _ZN6myname3varE = 10.0;
int main(){
printf("%dn", _ZN6myname3varE);
return 0;
}
gcc
编译结果为:
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
为什么要重新定义_ZN6myname3varE
?
警告‘_ZN6myname3varE’ initialized and declared ‘extern’ [enabled by default]
是什么意思?
如果程序在保留名称的上下文中声明或定义名称(此子句明确允许的名称除外(,则行为是未定义的。
17.4.3.1.2 全局名称
包含双下划线 (_ _( 或以下划线后跟大写字母开头的每个名称字母 (2.11( 保留给实现以供任何使用。
为什么要重新定义
_ZN6myname3varE
?
C++变量myname::var
由 GCC 重命名为_ZN6myname3varE
。 您还定义了一个名为 _ZN6myname3varE
的 C(即非残缺(变量。 因此,您对同一交易品种有多个定义。
警告[...]是什么意思?
标准用法是:
福.H
extern "C" int myvariable;
foo.c/cc
#include "foo.h"
int myvariable = 42;
我不确定C++标准是否允许初始化extern "C"
变量(即像您正在做的那样(。 但是编译器肯定会警告你,你正在做的事情可能没有意义。
第一条警告消息意味着如果在变量的声明中包含extern
,则不能同时包含初始值设定项。 因此,这两行都会生成该警告:
extern "C" int i = 9;
extern int j = 10;
您可以编写:
int i = 9;
int j = 10;
或:
extern "C" int i;
extern int j;
或者(正如Adam Rosenfield在评论中指出的那样(,您可以在行中包含大括号以允许初始值设定项:
extern "C" { int i = 9; }
应用于代码时,不能将初始值设定项= 42
放在extern "C"
行中,或者需要编写:
extern "C" { double _ZN6myname3varE = 10.0; }
孤立地,忽略最后一个问题,这应该"有效"。
第二个警告意味着namespace myname { double var = 42; }
是一个double
,因此%d
转换规范是错误的;它应该是%f
或%e
或%g
或变体。
printf("%fn", myname::var);
第三条消息,错误,来自汇编程序。 因为第一条消息只是一个警告,所以您实际上有两个不同的定义,当它们被破坏时,会转换为 _ZN6myname3varE
,具有两个不同的初始值设定项。 您只允许使用一个定义 — 一个定义规则。
但是,以下划线后跟大写字母开头的名称是为实现保留的,因此尝试直接使用该名称_ZN6myname3varE
,您将调用未定义的行为。 不要乱搞未定义的行为;避免它。
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了