相关疑难解决方法(0)

宏和功能相同的名称

我有以下代码

#define myfunc(a,b) myfunc(do_a(a), do_b(b))

void myfunc(int a, int b)
{
  do_blah(a,b);
}
int main()
{
    int x = 6, y = 7;
    myfunc(x,y);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望预处理器只在调用时扩展函数myfunc.预处理后所需的代码如下所示:

void myfunc(int a, int b)
{
  do_blah(a,b);
}
int main()
{
    int x = 6, y = 7;
    myfunc(do_a(x),do_b(y));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是函数定义也像这样扩展

void myfunc(do_a(int a), do_b(int b))
{
  do_blah(a,b);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法只在我们扩展函数调用时才进行宏扩展?我尝试了很多解决方案,似乎不可能,但我希望有人看到这样的情况......

注意:请不要告诉我重命名宏或函数名称:D

Update1:​​谢谢你的帮助.但我只能改变宏的定义,我无法改变它的位置,我也无法改变函数的实现.

c macros c-preprocessor

9
推荐指数
2
解决办法
6975
查看次数

C标准是否有任何限制,允许将函数实现为宏?

通常,除了提供函数声明之外,C标准头文件还可以提供"屏蔽宏"以使事情更快.例如,如果我包含ctype.h,则头文件将声明

int isdigit(int c);
Run Code Online (Sandbox Code Playgroud)

但它也可能用宏来掩盖声明.我相信这是一个isdigit符合C标准的便携式宏:

#define isdigit(c) ((c) >= '0' && (c) <= '9')
Run Code Online (Sandbox Code Playgroud)

当然,这个宏也很危险,因为如果在定义宏时执行此操作会引入未定义的行为:

int c = 'A';
printf("%d\n", isdigit(c++));
Run Code Online (Sandbox Code Playgroud)

为了避免UB在这个假设的情况下,我必须用parens包围函数名: (isdigit)(c++).所以,我的问题是:标准头可以定义哪种屏蔽宏有什么限制吗?如果参数表达式具有副作用,或者它们在技术上是否允许具有奇怪的行为(例如我们在上面看到),它们是否保证不会导致未定义的行为?限制在哪里?

c macros standards

6
推荐指数
1
解决办法
285
查看次数

getc是宏还是函数?

我试图找到之间的差异getcfgetc.那时我看到一个声明如下:

getc和fgetc之间的区别在于getc可以实现为宏,而fgetc不能实现为宏.

那么,getc真的是一个函数还是一个宏?如果它是宏,它会调用其他一些功能.那么,是否getc用C实现?

c unix linux macros

1
推荐指数
1
解决办法
759
查看次数

标签 统计

c ×3

macros ×3

c-preprocessor ×1

linux ×1

standards ×1

unix ×1