2012-07-13 48 views
1

我在0x102地址中有一個整數值,我需要創建#define ABC ...宏。
ABC是可變的或什麼(訪問0x102單元格)。
必須能夠做到操作是這樣的:如何「定義」這個變量?

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

你能幫助我嗎?

+0

你怎麼知道* *它會在地址'0x102'? – ArjunShankar 2012-07-13 12:17:48

+1

@ArjunShankar也許他正在使用嵌入式系統? – 2012-07-13 12:19:41

+0

btw how'bout'#define ABC ABC'? – 2012-07-13 12:20:13

回答

7

假設你的對象是16位(地址0x102爲2個字節對​​齊):

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

我喜歡你的圓括號和'volatile'比我的回答更好。 – Flexo 2012-07-13 12:22:30

+0

感謝您的幫助:) – 2012-07-13 12:30:59

1

你可以這樣說:

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

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

它設置int*然後deferences它一氣呵成。

0

如果該地址是一個常數,你可以寫:

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

如果在該地址的變量(以如my_variable名):

你想要的是什麼C++調用引用。在C中,它不存在。但是,您可以像您猜測的那樣爲它使用宏。

如果這個變量是在相同的範圍內ABC,所有你需要的是:

#define ABC my_variable 

如果你有一個指向該變量(例如作爲函數參數),你可以寫這樣的事情:

#define ABC (*that_argument) 
0

作爲編譯時間,編譯器將#defined變量替換爲實際值。

所以,如果你#define ABC

1)ABC = 666; 您將無法執行此操作。

2)int x = ABC*2 + 4; 您將能夠藉此在此操作

3)int *p = &ABC; 您將無法執行此操作。

0

您可以通過添加編譯時宏來實現。如果您使用的是IDE,則可以在項目設置中的「預處理器」字段中添加ABC=(*(int*)0x102)。否則,如果您使用的是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; 
}