1

再会!我试图找到很长一段时间的决定。

我的问题是:

例如,我有 2 个 .cpp 文件,其中一个包含

const std::string DICTIONARY_DEFAULT = "blah";
const std::string ADDTODICTIONARY_DEFAULT = "blah";
const std::string BUTTONS = "blah";

第二个是

static int  x1;
static int  NewY1, NewY2, NewX1, NewX2;

两个片段都在全局变量部分。我需要打印全局静态变量(例如),但忽略常量。在 nm 输出中,它们看起来完全相同(每种情况下的 b 类型,这意味着未初始化的本地范围符号)。有没有办法仅使用 linux 实用程序(grep、regexps 等完全可以)来自动分离这种情况?

我的任务是更好地理解:

C++中有一个程序,主要任务是查找和撤消全局变量列表。输入数据看起来像包含大量 .cpp 文件的档案。每个 .cpp 文件都是语法正确的 C++ 程序(必须使用编译器 GNU C++ 和 Microsoft Visual C++ 成功编译)。对于存档中的每个文件,我必须以单独的字符串输出文件名和全局变量列表,如示例中所示:

输出数据:

000000.cpp ancestor ansv cost graph M N p qr query u
000001.cpp
000002.cpp
000003.cpp
000004.cpp
000005.cpp
000006.cpp
000007.cpp edge tree
4

2 回答 2

1

查找全局变量是本 clang 教程的“主题” ——在本教程中作者“只是为了好玩”,但您可以添加一些代码来完全满足您的需求......(顺便说一句,这并不难有人可能会猜到:))

于 2012-12-03T14:50:24.050 回答
0

简短的回答:实际上没有办法在每种情况下都这样做

长答案:使用“objdump -x file.o”查看符号表。您可以看到所有全局变量,包括静态和常量,都分配到一个名为 .bss 的部分中。还存在一个称为 .rodata 的部分,一般来说,它用于存储 const 数据。不幸的是,在您的情况下,您声明了两个 const std::string 对象。这些对象通过在“main”函数运行之前调用它们的构造函数来初始化。尽管如此,它们的字段的初始化发生在运行时,因此它们只是“逻辑上”的 const,而不是真正的 const。

编译器别无选择,只能将它们与所有其他全局变量一起分配到 .bss 部分。如果添加以下行

const int willBeInRoData = 42;

您会发现它的符号将在 .rodata 部分中,因此它将与其他全局整数区分开来。

于 2012-12-03T16:16:59.040 回答