我定义了一个宏,但我需要根据条件在运行时更改该值。如何实现这一点?
我定义了一个宏,但我需要根据条件在运行时更改该值。如何实现这一点?
宏在源文件编译之前被预处理器替换为其值。你无法在运行时更改宏的值。
如果您可以更详细地解释您想要实现的目标,那么无疑会有其他不需要使用宏的解决方案来解决您的问题。
您无法更改宏本身,即它所展开的内容,但是您可能可以更改其中包含宏的表达式的值。以下是一个非常愚蠢的例子:
#include <stdio.h>
#define UNCHANGEABLE_VALUE 5
#define CHANGEABLE_VALUE foo
int foo = 5;
int main() {
printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
CHANGEABLE_VALUE = 10;
printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
}
因此,你的问题的答案取决于你希望改变宏对代码产生何种影响。5
是一个编译时常量,而 foo
不是,因此如果你打算将 CHANGEABLE_VALUE
用作 case
标签或其他用途,则这样做是行不通的。const int
对象与整数文字定义的宏进行比较。 case UNCHANGEABLE_VALUE:
是可以的,case CHANGEABLE_VALUE:
不行。 - Steve Jessop根据您的需求,有多种方式可以实现。
使用全局变量代替宏
// someincludefile.h
extern static int foo;
// someincludefile.c
static int foo = 5;
// someotherfile.c
#include "someincludefile.h"
printf("%d\n", foo); // >> 5
foo = -5;
printf("%d\n", foo); // >> -5
您可以切换的条件
// someincludefile.h
extern static int condition;
#define FOO1 (5)
#define FOO2 (-5)
#define FOO (condition ? (FOO1) : (FOO2))
// someincludefile.c
static int condition = 1;
// someotherfile.c
#include "someincludefile.h"
printf("%d\n", FOO); // >> 5
condition = 0;
printf("%d\n", FOO); // >> -5
本地和动态评估的条件
// someincludefile.h
#define CONDITION (bar >= 0)
#define FOO1 (5)
#define FOO2 (-5)
#define FOO ((CONDITION) ? (FOO1) : (FOO2))
// someotherfile.c
#include "someincludefile.h"
int bar = 1;
printf("%d\n", FOO); // >> 5
bar = -1;
printf("%d\n", FOO); // >> -5
在最后一个示例中,条件的评估将被视为在您的本地作用域中编写其代码,因此您可以在其中使用本地变量和/或参数,但如果需要,您也可以使用全局变量。