【问题标题】:C function like macros: expected an expression [closed]像宏一样的C函数:需要一个表达式[关闭]
【发布时间】:2014-01-19 16:52:11
【问题描述】:

有人可以在这里帮助我吗,因为我不知道这里的世界正在发生什么 所以基本上这就是我正在努力使用这些功能

#define LOWCONVERT(c) (if(isupper(c) > (0) \
                   isupper(c) == (0))

上面的宏应该将大写字母转换为小写字符

用来比较两个数字的第二个宏是:

#define COMPARISON(d,f) (if (d > f))\
                    printf("d is greater than f\n");\
                    else\
                        if (d == f)\
                    printf("d equals f\n");\
                    else\
                        if(d < f)\
                        printf("d is smaller than f\n");)

当我使用它们时,它给了我: “错误:需要一个表达式”

【问题讨论】:

  • 顺便说一句,如果你 讨厌指针 就像你的昵称所暗示的那样,不要用 C 编写代码。学习一些更高级的语言,如 Ocaml、Haskell、Scheme、Common Lisp... .
  • 也许是#define LOWCONVERT(c) (isupper(c) ? tolower(c) : (c))
  • 哈哈我讨厌指针,因为它们给了我地狱。我花了大约 3 个月的时间来理解这个概念。我将尽快更改该昵称,因为它引起了太多关注。谢谢你的回答。

标签: c function macros


【解决方案1】:

您不能将语句用作表达式。如果您想在一个宏中对多个语句进行分组,一种常见的方法是使用 do...while 循环:

#define COMPARISON(d, f)                     \
    do {                                     \
        if ((d) > (f))                       \
            printf("d is greater than f\n"); \
        else if ((d) == (f))                 \
            printf("d equals f\n");          \
        else if((d) < (f))                   \
            printf("d is smaller than f\n"); \
    } while (0)

另外请注意,我将宏参数的用法放在括号内,否则参数可能包含导致比较操作失败的表达式。

【讨论】:

  • 是否可以添加转换器 (%d)?在 printf 函数中以这种方式而不是仅仅显示 d id 大于 f 它实际上打印出实际数字
  • @hatepointers 当然,只需执行例如printf("%d is smaller than %d\n", (d), (f)); \
【解决方案2】:

if 用于语句,而不用于表达式。左括号开始一个表达式。

GCC 启用名为 statement expressions 的扩展。

你最好使用inline functions。 (宏对于COMPARISON(i++,t[i--]) 之类的用法非常顽皮......)

您应该#include &lt;ctype.h&gt; 并使用tolower(3)isalpha(3) 之类的函数

请您的编译器向您显示预处理的表单。使用 GCC,使用gcc -C -E yoursource.c &gt; yoursource.i,然后使用编辑器或寻呼机查看yoursource.i 内部(例如less yoursource.i ...)

不要忘记在编译器中启用调试信息和所有警告。使用 GCC,这意味着使用 gcc -Wall -g 编译

【讨论】:

  • 哇这个网站太棒了。比你们这么多,我感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 2014-05-27
  • 2013-07-02
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
相关资源
最近更新 更多