【问题标题】:How to "#define" this variable?如何“#define”这个变量?
【发布时间】:2012-07-15 06:56:44
【问题描述】:

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

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

你能帮帮我吗?

【问题讨论】:

  • 你怎么知道它会在地址0x102
  • @ArjunShankar 也许他正在使用嵌入式系统?
  • 顺便说一句 #define ABC ABC 怎么样?

标签: c pointers memory-management


【解决方案1】:

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

#define ABC  (*(volatile uint16_t *) 0x102)

【讨论】:

  • 我喜欢你的括号和volatile,比我的回答好。
【解决方案2】:

你可以这样做:

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

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

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

【讨论】:

    【解决方案3】:

    如果你有地址作为常量,你可以这样写:

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

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

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

    如果这个变量和ABC在同一个范围内,你只需要:

    #define ABC my_variable
    

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

    #define ABC (*that_argument)
    

    【讨论】:

      【解决方案4】:

      您可以通过添加编译时宏来做到这一点。如果您使用的是 IDE,您可以在项目设置的 Preprocessor 字段中添加 ABC=(*(int*)0x102)it。否则,如果您使用 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;
      }
      

      【讨论】:

        【解决方案5】:

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

        所以,如果你#define ABC

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-05
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 2011-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多