我foo
在 C 文件中声明了一个数组,然后extern
在相应的头文件中声明该数组。然后我foo
从另一个文件访问,但是数组中第一个元素的地址是无效地址,并且与foo
定义的编译单元中的地址不同。这是使用 ARM CodeSourcery 编译器从 Pebble SDK 构建的。
示例代码:
测试1.h
extern int foo[];
void testRoutine();
测试1.c
#include <pebble.h>
#include "test1.h"
void testRoutine()
{
APP_LOG(APP_LOG_LEVEL_INFO, "Hello World! foo: 0x%x", (unsigned int)&foo[0]);
}
int foo[] = {1,2,3,4,5,6};
主程序
#include <pebble.h>
#include "test1.h"
int main()
{
APP_LOG(APP_LOG_LEVEL_INFO, "Start of test");
testRoutine(); // Print the address of foo from the perspective of test1.c
APP_LOG(APP_LOG_LEVEL_INFO, "foo: 0x%x", (unsigned int)&foo[0]);
return 0;
}
预期输出:
Start of test
Hello World! foo: 0x12345678
foo: 0x12345678
实际输出:
Start of test
Hello World! foo: 0x20081234
foo: 0x21941234 (placeholders, I can't get the real addresses right now)
此代码在标准 x86 GCC 中按预期工作,但在 ARM 编译器上不起作用。我把代码弄乱了,还是这里有编译器错误?