2014-11-13 6 views
-4

может любой скажите, пожалуйста, как работает код ниже,#define func (t, a, b) {t t temp; t temp = a; t a = b; б = темп;}

#define func(t, a, b){ t temp; temp=a; a=b; b=temp;} 

int main() 
{ 

int a=3, b=4; 
float c=4.5, d=5.99; 

func(int, a, b); 
func(float, c, d); 

printf("%d %d\n", a,b); 
printf("%.2f %.2f\n",c,d); 

return 0; 
} 

это даст выгружена выход, как показано ниже

4 3 
5.99 4.50 

Мои вопросы

1) "#define func (" является функцией с переменным аргументом ..

2) почему «t temp;» не дает никакой ошибки ??

3) можно ли отправить тип данных в качестве аргумента. ??

Я не знаю, как это работает, я знаю только отправка переменные, структуры, указатели и значения, но я не знаю, как мы можем послать тип данных и, почему отправка требуется тип данных,

+3

[Пожалуйста, напишите лучший заголовок на ваш вопрос] (http://meta.stackexchange.com/questions/10647/writing-a-good-title) –

+3

Директива '# define' предназначена для препроцессора и создает a * macro *, а не функция. И этот код не имеет ничего общего с C#, поэтому я удаляю этот тег. –

+1

Чтобы узнать больше, вы можете запустить свой код через препроцессор и посмотреть на генерируемый код. Затем вы увидите, что произошло и как компилятор увидит код. –

ответ

5

Я не знаю, какой «с» является то, что, но, как кажется (если код компилируется, прогоны и производит ожидаемый результат):

#define func(t, a, b){ t temp; temp=a; a=b; b=temp;} 

#define является pre-processor директивой обычно используются для создания псевдонимов (макросы). является функционально подобным макросом имя, какой предварительный процессор будет искать в вашем коде и заменяет , что после этого.

() Внутри вы определяете параметры: t, a и b. Всякий раз, когда вы пишете func(1,2,3), эти значения, разделенные запятыми, будут присвоены параметрам: t станет 1, a = 2 и = 3. Затем макрос тела будет обработан для создания встроенного кода с этими значениями.Поскольку эта замена происходит перед компиляцией (это то, что означает предварительная обработка), есть нет проверок или ошибки, ваш источник будет изменен и только тогда произойдет компиляция (возможно, с ошибками во время компиляции).

Когда вы пишете func(int, a, b); линию, то во время предварительной обработки, будет модифицируется в

{ t temp; temp=a; a=b; b=temp;} 

где t = int, a = a и b = b, поэтому он стал

{ int temp; temp=a; a=b; b=temp;} 

и тогда это будет скомпилировано. Как вы можете видеть, это абсолютно правильный код.

В частности, на ваш вопрос вы не отправляете типы макросов. Макросы работают с простым текстом так же, как вы набираете текст для создания исходного кода.

4

Там это несколько вещей, которые вам нужно знать. Сначала t, a и b все подставляются в тело макроса независимо от того, что они есть, ОНИ НЕ ПЕРЕМЕНЫ!

Таким образом, когда вы говорите:

func(int, a, b)

он интерпретируется как это:

Создайте переменную с именем temp типа t (в данном случае целое число), то заданная температура, равной значение a и b равно значению temp.

Хотя это может выглядеть, этот макрос НЕ является ФУНКЦИЕЙ!

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

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