在 C 中使用预处理器检查三个变量的最大值

Check max value from three variables by using preprocessor in C

我想打印具有最高值的变量值。我想通过使用预处理器来做到这一点,但我不知道该怎么做。使用 if-else 很容易做到这一点,但是如何使用预处理器来做到这一点呢? 这是我的代码

#include <stdio.h>
#define MAX(a,b,c)
#if a > (b && c)
#   define a
#endif
#if b > (a && c)
#   define b
#else
#   define c
#endif

int main (void)
{
    int wynik;
    int a = 6;
    int b = 13;
    int c = 9;
    wynik = MAX(a,b,c);
    printf("%i", wynik);

    return 0;
}

这是我终端的错误

E:\skrypty_c>gcc -o Cwiczenie12_4.exe Cwiczenie12_4.c
Cwiczenie12_4.c: In function 'main':
Cwiczenie12_4.c:17:11: error: expected identifier or '(' before '=' token
     int c = 9;
           ^
Cwiczenie12_4.c:18:23: error: expected expression before ';' token
     wynik = MAX(a,b,c);

事情不是这样的。你的 max-of-three 宏类似于

#define MAX(a, b, c) ((a) <= (b)? (b) <= (c)? (c) : (b) : (a) <= (c)? (c) : (a))

但坦率地说,作为一个函数会好得多:

inline int max(int a, int b, int c) {
    if(a <= b) {
        if(b <= c) return c;
        return b;
    }
    return a <= c? c : a;
}

您不能通过预处理器条件检查运行时变量的值。他们只能检查预处理器级别符号的值。例如

#define A 5

#if (A  > 3)
...
#endif

看看您使用 #define#if 的方式,我猜 是您的意思是定义某种 预处理器级别功能 具有 #define 与 Python 中的 def func (): 类似的作用。 事情不是这样的。

  • #define A expr 只是将 符号 A 替换为 表达式 expr在当前源文件编译前。没有出现 A,没有替换
  • #define A(b,c) expr和上一个一样,但是像函数参数一样使用了b,c,并且在中的replaced中进行了扩展expression expr 使用调用宏时传递的值。
  • #if expr#ifdef symbol#ifndef symbol 是检查先前通过 #defines(或通过编译器选项 -D)定义的符号的值甚至简单定义的方法,以便对整个部分执行 条件编译 的代码。这些部分以 #endif 结束,并且可以使用 #else#elif 指令编译出现错误条件时的替代部分。

你可以做的,我怀疑这是你的实际目的,是定义一个宏来寻找它的参数中的最大值:

#define MAX(a,b,c) \
    (((a>b) && (a>c))? a : ((b>a) && (b>c))? b : c ))

我使用了三元运算符来计算最大值。

注意: \ 字符允许在多行上放置一个宏。它必须是该行的最后一个字符。

预处理器不能用于此。预处理器对 c 变量和 sysntax 一无所知。

您不能在#defines 中使用任何预处理器条件表达式。

如果您想使用宏来查找最多 3 个标记,您需要为此使用 C 表达式,因为它将在运行时(或编译时)而不是在预处理期间计算

#define MAX(a,b,c)  (a) > (b) ? ((a) > (c) ? (a) : ((c) > (b) ? c : (b))) : ((b) > (c) ? (b) : (c))