2014-10-30 3 views
1

У меня такое заявление для PowerPC и не знаю, как это работаетTricky макросъемки в C

#define XOR(A,D) (*(volatile unsigned int*)(volatile void*)((unsigned char*)0UL + (A)) ^= (D)) 

, который называется (например)

unsigned int a = 3; 
unsigned int b = 50; 
XOR((unsigned int)&a,b); 

С НКУ для стандартный компьютер, который он не компилирует, в моей среде это было, поэтому я спрашиваю себя: wtf ...

+1

Ну, во-первых, у вас есть дополнительный ')' в конце вашего вызова 'XOR' ... –

+0

Вы правы;) th – alabamajack

+0

Что такое' volatile void'? – harper

ответ

2

Это, по-видимому, излишне запутанный макрос для переключения битов по жестко закодированным адресам. Эти адреса, вероятно, являются адресами регистра памяти. A и D являются ключевыми словами: A = адрес, D = данные. Так обычно, если у вас есть регистр по адресу 0x100, и вы хотите, чтобы переключить его младший значащий бит, вы могли бы написать что-то вроде:

XOR(0x100, 0x01); 

Намного проще версия будет просто:

#define XOR(A, D) ((*(volatile int *)(A)) ^= (D)) 

Это не ясно, почему оригинальный автор использовал несколько приведений и добавил жестко кодированный адрес указателю NULL. По предположению, первый может быть там, чтобы избавиться от предупреждения компилятора, последний, возможно, должен был в какой-то момент разрешить другой регистр.

+0

Что касается свернутой серии бросков, это может помочь компилятору выбрать правильную/лучшую кодировку команд. –

+0

Извините, не видел этого в вашем последнем правлении. –

+1

WOW ... Этот ответ подходит именно к использованию кода в моей среде, имеет смысл ... Я тестирую использование без XOR-кода, и я не получаю данные из моего чипа! Так спасибо много! – alabamajack

2

Это невероятно запутанных способ написания

*(volatile uint32_t*)a ^= b; 

(я выбрал uint32_t, потому что это было указано, что процессор был PowerPC)

Всякий раз, когда вы видите людей, которые пытаются повторно изобрести язык C с их собственным неясным макроязыком, вы можете быть уверены, что программа имеет сомнительное качество. В этом случае очевидно, что программист очень не уверен в том, как работает C, и я бы рассматривал остальную часть своего кода с большим скептицизмом.

Не используйте функциональные макросы в этом случае.

-2

Дополнительное преобразование - это уменьшение предупреждений MISRA. Here является ссылкой.

Смежные вопросы