相关疑难解决方法(0)

全局变量实现

当我写下面的程序时:

档案1:

#include <stdio.h>    
int global;    
void print_global1() {
        printf("%p\n", &global);
}
Run Code Online (Sandbox Code Playgroud)

档案2:

#include <stdio.h>
char global;    
void print_global2() {
        printf("%p\n", &global);
}
Run Code Online (Sandbox Code Playgroud)

档案3:

void print_global1();
void print_global2();
int main()
{
        print_global1();
        print_global2();

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./a.out
0x804a01c
0x804a01c
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  • 为什么链接器将"int global"和"char global"实现为相同的全局变量:
  • 为什么编译器不会抱怨(不是最小的警告-Wall -Wextra -ansi......)
  • 如何管理全局变量的大小(int和char的大小不同)

PS:第二个问题是架构/编译器相关,所以让我们把gcc或Visual C++(对于C)的int大小为32位

编辑:这不是C++的问题,但对于C!

我使用gcc版本4.4.1和Ubuntu 9.10,这是编译控制台输出:

$ ls
global_data1.c  global_data2.c  global_data.c

$ gcc -Wall -Wextra -ansi global_data*.c
$ ./a.out
0x804a01c
0x804a01c
or 
$ gcc -Wall -Wextra -ansi -c global_data*.c
$ …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction variables global-variables

17
推荐指数
2
解决办法
4378
查看次数

在C vs C++中由编译器在目标文件中包含未使用的符号

这可能是一个愚蠢的问题,但也许有人可以提供一些见解.

我在头文件中定义了一些全局变量(是的,我知道这很糟糕,但这只是一种假设情况).我将此头文件包含在两个源文件中,然后将这些文件编译为两个目标文件.全局符号不会在代码中的任何位置引用.

如果源文件是C,那么看起来编译器省略了全局符号,并且所有链接都没有错误.如果源文件是C++,则符号包含在两个目标文件中,然后我会收到链接器错误.对于C++,当我包含标题时,我使用extern"C".

我正在使用VS2005的Microsoft编译器.

这是我的代码:

头文件(test.h):

#ifndef __TEST_H
#define __TEST_H

/* declaration in header file */
void *ptr;

#endif
Run Code Online (Sandbox Code Playgroud)

C源文件:

test1.c

#include "test.h"

int main( ) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test2.c中

#include "test.h"
Run Code Online (Sandbox Code Playgroud)

C++源文件:

test1.cpp

extern "C" {
#include "test.h"
}

int main( ) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试2.cpp

extern "C" {
#include "test.h"
}
Run Code Online (Sandbox Code Playgroud)

对于C,目标文件看起来像这样:

Dump of file test1.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 006DC627 ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | …
Run Code Online (Sandbox Code Playgroud)

c c++ compilation

2
推荐指数
1
解决办法
1575
查看次数