Проблема макроса встроенной функции C - PullRequest
5 голосов
/ 12 октября 2010

Я сталкивался с этим во встроенном оборудовании, используя C.

#define EnterPWDN(clkcon) (  (void (*)(int))0xc0080e0 ) (clkcon) 

Я понятия не имею, как работает этот макрос функции.Я понимаю, clkcon является параметром функции для EnterPWDN, но что происходит после этого?

Ответы [ 3 ]

8 голосов
/ 12 октября 2010

Преобразует адрес 0xc0080e0 в указатель на функцию, принимающую int и возвращающую void, и вызывает эту функцию, передавая clkcon в качестве параметра.

Прописано:

typedef void (func_ptr*)(int);
func_ptr func = (func_ptr)0xc0080e0;
func(clkcon);

(Если вы не сталкивались с указателями на функции, вы можете получить хорошее введение в C и прочитать тему.)

5 голосов
/ 12 октября 2010

Это указатель на функцию void, которая принимает int в качестве параметра.Функция хранится по определенному адресу памяти 0xc0080e0.

(void (*)(int))

Выше приведено объявление указателя функции.Сначала идет тип возврата void.Далее следует тот факт, что его указатель и, наконец, int сообщает вам, каков параметр функции.Адрес памяти - это место, в котором хранится функция, и все это преобразует этот адрес памяти в правильный тип указателя функции, а затем вызывает функцию и передает ей «clkcon».

3 голосов
/ 12 октября 2010

Отличные ответы Гоз и sbi , но, говоря иначе:

По определенному адресу (0xc0080e0) в памяти, возможно, в ПЗУ, имеется функция. Вы вызываете эту функцию с аргументом int clkcon.

...