像宏一样的功能

Function like macros

这是有效的 C 代码吗:

foo.h:

#ifndef FOO_H_
#define FOO_H_

#define FUNC(var)   \
   do               \
   {                \
      //something  \
   }while(0)        \

#endif

foo.c:

#include <stdio.h>
#include "foo.h"

FUNC(5); //How is it possible to call the function-like macro from here?

int main(void)
{
   //do something
   return 0;
}

我有一些(工作)代码是这样排列的,并且在全局范围内调用类似函数的宏。这怎么可能?

编译器将发出一条错误消息,因为您只能在文件范围内放置声明。您不能放置 do-while 语句。

这个宏

FUNC(5);

只是由预处理器在文件范围内或放置宏的地方替换此 do while 语句

do 
{
   //something
}while(0); 

您似乎提取了一个不完整的代码片段。

要使代码有效,您需要放置此宏 FUNC(5);在函数定义中。

I have some (working) code that is arranged like this, and in global scope calling a function-like macro. How is this possible?

在文件范围内调用 function-like 宏没有任何 固有的 错误。根据宏的参数,这完全是宏替换文本的问题。您在问题中出现的 function-like 宏无法在文件范围内调用,因为它扩展为 do / while 语句,并且它们必须出现在函数内部。无论您想到什么示例,该作品都不能具有相同类型的替换文本。

下面是一个演示可以在文件范围内展开的 function-like 宏的示例:

#include <stdio.h>

#define DECL_INT(v,i) int v = (i)

DECL_INT(var, 42);

int main(void) {
    printf("%d\n", var);
}

这与 ...

的意思完全相同
#include <stdio.h>

int var = (42);

int main(void) {
    printf("%d\n", var);
}