【发布时间】:2020-06-17 11:53:13
【问题描述】:
我正在使用 C 语言开发一个库。我有一个函数应该可供该库的用户使用。当某个值被定义为 1 时应该编译并执行,但是当这个值被定义为 0 时根本不应该编译(用法应该替换为 (void)0 将被优化掉)。
我想通了,我可以为此使用宏,就像这里:
#include <stdio.h>
#include <stdarg.h>
#define ENABLE_PRINT_NUMBERS 0
#if ENABLE_PRINT_NUMBERS
void print_numbers(int number, ...);
#endif
#if !ENABLE_PRINT_NUMBERS
#define print_numbers(number, ...) (void)0
#endif
#if ENABLE_PRINT_NUMBERS
void print_numbers(int number, ...) {
va_list va;
va_start(va, number);
const int second_number = va_arg(va, int);
va_end(va);
printf("numbers: %d, %d\n", number, second_number);
}
#endif
int main() {
printf("## Shadowing by macro - test ##\n\n");
print_numbers(1, 2);
printf("function address: 0x%x\n", (void*)&print_numbers);
return 0;
}
但是,当这样的函数没有被编译时(#define ENABLE_PRINT_NUMBERS 1),&print_numbers 不会被声明。有没有办法编写一个宏来声明用法和函数的地址?仅使用函数名称编写第二个定义会导致 print_numbers previously defined here 错误。
我想避免“特殊的空函数”,因为这个库中有 15 个其他函数需要在发布时删除。该库适用于嵌入式设备,我希望内存占用尽可能小。
要明确:
我不想获得类似函数的宏的地址。我希望这个函数的地址有一些值(最好是空),因为这个函数的地址在库中的很多地方都使用过,我试图尽可能少地修改库。使用这种地址的地方会检查指针是否为空,因此不会导致未定义的行为。
【问题讨论】:
-
我不明白你为什么要尝试获取和打印类似函数的宏的地址而不是定义的函数?宏只是在编译之前扩展的宏。它在内存中没有地址。任何这样做的尝试都是违反 C 语法的,编译器应该提供一个错误。
-
不想获取类函数宏的地址。我希望这个函数的地址有一些值(最好是空),因为这个函数的地址在图书馆的很多地方都使用过,我试图尽可能少地修改。
标签: c macros variadic-macros