getchar()和putchar()宏如何?

时间:2017-08-18 15:42:52

标签: c c-preprocessor getchar putchar

根据我对C中宏的理解,它们是预定义的常量,将在整个程序中使用它们的常量值,因此我们继续定义它们以避免进一步的复杂化并使代码更具可读性,因此人们阅读它会明白什么应该保持不变,什么不是。

我在这里和那里(C编程现代方法,K.N King)我们可以将这两个函数定义为宏。

由于我对C有些新手,我无法理解这两者如何被定义为宏?

3 个答案:

答案 0 :(得分:2)

有两种类型的宏:简单替换宏和类似函数的宏。

替换宏将符号的一个实例替换为另一个实例。例如:

#define LEN 10
char str[LEN];

预处理后,变为:

char str[10];

类似函数的宏可以将参数插入到被替换的内容中:

#define MAX(a,b) ((a) > (b) ? (a) : (b))
int x = MAX(2,3);

预处理后:

int x = ((2) > (3) ? (2) : (3));

如果是getcharputchar,则可以定义如下:

#define getchar() getc(stdin)
#define putchar(c) putc(c, stdout)

答案 1 :(得分:1)

完全取决于实施。它们也可以起作用。

标准不要求任何关于实施类型的明确要求。但您可以检查 here Any function declared in a header may be additionally implemented...。正如Eugene.Sh所指出的

更清楚地说,库中可能有一个函数,或者它也可以是一个宏(对于getchar)。经典地,getchar()的宏将是#define getchar() getc(stdin)getc()也可能是宏。

标准说 getc函数等效于fgetc,除非它是作为宏实现的,它可能会多次评估流,所以参数永远不应该是带有副作用的表达式

现在它归结为fgetc,在这种情况下,我们知道它是一个函数。线程安全使其更有可能成为一种功能。

答案 2 :(得分:1)

基本上有三种类型的预处理器宏:

  1. 简单定义,没有任何价值。例如

    #define THIS_IS_A_MACRO
    

    此类宏用于conditional compilation

  2. 符号常量。例如

    #define SOME_SYMBOLIC_CONSTANT  123
    

    这些宏是您的想法。

  3. 类似函数的宏。敌人的例子

    #define SOME_MACRO(a_macro_argument)  printf("Macro invoked with argument %d\n", a_macro_argument)
    

    这种宏非常类似于函数,但在编译器解析器看到代码之前被源代码中的预处理器替换,宏参数替换为它们的实际值。

  4. 让我们采用类似函数的宏以及预处理器将如何扩展

    SOME_MACRO(123);
    

    以上内容将被替换为

    printf("Macro invoked with argument %d\n", 123);