当我写下面的程序时:
档案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)
这是我的问题:
-Wall -Wextra -ansi......)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,那么看起来编译器省略了全局符号,并且所有链接都没有错误.如果源文件是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)