像宏一样的功能
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);
}
这是有效的 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);
}