1

我在 0x102 地址中有一个整数值,我需要创建#define ABC ...宏。
ABC 是变量或其他东西(可以访问 0x102 单元格)。
必须可以进行这样的操作:

ABC = 666;  
int x = ABC*2 + 4;  
int *p = &ABC;  

你能帮助我吗 ?

4

5 回答 5

7

假设您的对象是 16 位的(地址 0x102 是 2 字节对齐的):

#define ABC  (*(volatile uint16_t *) 0x102)
于 2012-07-13T12:20:35.553 回答
1

你可以这样做:

#define ABC *((int*)0x102)

int main() {
  ABC = -1;
  return 0;
}

它设置了一个int*,然后一口气将其全部遵从。

于 2012-07-13T12:20:45.947 回答
0

在编译时,编译器将 #defined 变量替换为实际值。

所以,如果你#define ABC

1)ABC = 666; 您将无法执行此操作。

2)int x = ABC*2 + 4; 您将能够执行此操作

3)int *p = &ABC; 您将无法执行此操作。

于 2012-07-13T12:24:42.567 回答
0

如果您将地址作为常量,则可以编写:

#define ABC (*(int *)0x102)

如果您在该地址中有一个变量(名称如my_variable):

您想要的是 C++ 所称的引用。在 C 中,它不存在。但是,正如您猜想的那样,您可以使用宏。

如果此变量与 位于同一范围内ABC,则您只需要:

#define ABC my_variable

如果你有一个指向这个变量的指针(例如作为一个函数参数),你可以这样写:

#define ABC (*that_argument)
于 2012-07-13T12:21:24.293 回答
0

您可以通过添加编译时宏来做到这一点。ABC=(*(int*)0x102)如果您使用的是 IDE,您可以在项目设置的 Preprocessor 字段中添加它。或者,如果您使用 CLI 编译器,例如,gcc您可以按如下方式编译程序。

gcc prog.c -DABC=(*(int*)0x102)

或者您可以直接在程序中定义它,如下所示

#define ABC (*(int *)0x102)

int main()
{
    ABC = 666;  
    int x = ABC*2 + 4;  
    int *p = &ABC;  
    return 0;
}
于 2012-07-13T16:37:27.630 回答