0

我很难找到 C++ 编译器究竟如何决定要定义或未定义的符号。我的意思是如何在 C++ 源代码中知道变量/函数是否将被编译为已定义或未定义的符号。首先,我认为所有已定义的变量/函数都将是已定义的符号,但似乎并非如此。考虑到静态,外部,内联,......关键字,有没有办法准确地确定这一点?

*更新问题不在于 C++ 中的定义和声明,也不在于我的代码是否可以编译。现在我认为如果我编译代码并使用 nm 检查目标文件,一些仅在 C++ 源代码中声明的函数/变量会成为定义的符号。我需要这些信息:已定义/声明的 C++ 函数/变量如何编译为对象文件的已定义/未定义符号(例如 ELF)。

4

2 回答 2

0

如果您只声明但不定义变量/函数,它将不会被定义。

// In global/namespace scope
int i; // defined
extern int ei; // not defined
extern int eid = 42; // assignment causes it to be defined

void foo(); // not defined
void bar() { } // defined
于 2012-05-08T13:10:23.283 回答
0

当您将 foo.cpp 编译为 foo.o 时,在 foo.cpp 中定义的某些符号将出现在 foo.o 中,其他符号将被“内联”。假设这是您的意思,那么您会发现这是特定于编译器和实现定义的。关于 GCC 对内联函数的行为有一个有趣的讨论,例如这里:

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

于 2012-05-08T15:59:45.340 回答