Можно ли использовать директивы #define для определения функций printf? - PullRequest
0 голосов
/ 13 февраля 2019

ниже - простая программа, над которой я работаю, мне нужно взять весь printf и определить его в директивах.

#include <stdio.h>
#define name(parameter) printf("......")

main(){
...
}

как мне это сделать?

#include <stdio.h>

#define FICA_PERCENTAGE 0.0765
#define HOURS_WORKED(int hours_worked) printf("\nHours Worked:  %d\n", hours_worked)
#define HOURLY_RATE(float hourly_rate) printf("Hourly Rate:  $%5.2f\n", hourly_rate)
#define GROSS_PAY(float gross_pay) printf("Gross PAy:  $%5.2f\n", gross_pay)
#define FICA_DEDUCTION(float fica_deduction) printf("FICA deduction:  $%5.2f\n", fica_deduction)
#define NET_PAY(float net_pay) printf("Net Pay:  $%5.2f\n", net_pay)

main(){

    int hours_worked;
    float hourly_rate, gross_pay, net_pay,fica_deduction;

    printf("Simple Payroll Program: \n");
    printf("-------------------\n");
    printf("Enter the number of hrs workrd: ");
    scanf("%d", &hoursWorked);
    printf("Enter the hourly rte of pay: ");
    scanf("%f", &hourly_rate);

    gross_pay = hoursWorked * hourly_rate;
    fica_deduction = gross_pay * FICA_PERCENTAGE;
    net_pay = gross_pay - fica_deduction;

    HOURS_WORKED;
    HOURLY_RATE;
    GROSS_PAY;
    FICA_DEDUCTION;
    NET_PAY;

    /*printf("\nHours Worked:  %d\n", hoursWorked);
    printf("Hourly Rate:  $%5.2f\n", hourly_rate);
    printf("Gross PAy:  $%5.2f\n", gross_pay);
    printf("FICA deduction:  $%5.2f\n", fica_deduction);
    printf("Net Pay:  $%5.2f\n", net_pay);*/

    return 0;
}

#include <stdio.h>

#define FICA_PERCENTAGE 0.0765
main(){

    int hours_worked;
    float hourly_rate, gross_pay, net_pay,fica_deduction;

    printf("Simple Payroll Program: \n");
    printf("-------------------\n");
    printf("Enter the number of hrs workrd: ");
    scanf("%d", &hoursWorked);
    printf("Enter the hourly rte of pay: ");
    scanf("%f", &hourly_rate);

    gross_pay = hoursWorked * hourly_rate;
    fica_deduction = gross_pay * FICA_PERCENTAGE;
    net_pay = gross_pay - fica_deduction;

    printf("\nHours Worked:  %d\n", hoursWorked);
    printf("Hourly Rate:  $%5.2f\n", hourly_rate);
    printf("Gross PAy:  $%5.2f\n", gross_pay);
    printf("FICA deduction:  $%5.2f\n", fica_deduction);
    printf("Net Pay:  $%5.2f\n", net_pay);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

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

Во-первых, аргументы макроса не имеют типа:

#define HOURS_WORKED(hours_worked) printf("\nHours Worked:  %d\n", hours_worked)

Во-вторых, когда вы вызываетемакрос, вам также необходимо предоставить аргумент:

HOURS_WORKED(hoursWorked);

Помните, что макросы, подобные функциям, не являются функциями - это просто текстовые замены.Макро аргументы не оцениваются, они просто раскрываются на месте.То есть, если вы вызовете HOURS_WORKED как

HOURS_WORKED(n * 40);

, тогда он расширится до

printf("\nHours Worked:  %d\n", n * 40)

Чтобы избежать проблем с приоритетами и синтаксическим анализом, часто хорошей идеей будет обернуть ваш аргумент макросав паранах:

#define HOURS_WORKED(hours_worked) printf("\nHours worked: %d\n", (hours_worked) );
0 голосов
/ 13 февраля 2019

Макросы выполняют подстановку, с необязательной подстановкой параметров

#define X yyyy

заменит вхождения токена X на yyyy.

#define X(Y) yyyy Y yyyy

заменит вхождения параметризованного токенаX(Foo) с yyyy Foo yyyy.

Взяв в качестве примера вашу первую попытку printf, кажется, что вы хотите:

#define HOURS_WORKED(Y) \
        printf("\nHours Worked:  %d\n", Y)

И затем вы бы назвали это так:

HOURS_WORKED(hoursWorked);

Другие ваши макросы и вызовы должны быть соответствующим образом скорректированы.

...