【发布时间】:2016-08-19 14:29:41
【问题描述】:
我在我的头文件中使用#define 来保护函数,我通过命令行将它作为全局编译标志添加到 make 中。这是为了在我不使用某些代码时减小整体二进制大小。
我以为我可以把它们放在头文件中,c文件中的函数会自动编译出来。这不是为我编译的。 Make 报告功能未声明。我还必须在 C 文件中的函数周围放置守卫以使其编译正常。
这是预期的行为还是应该保护函数声明就足够了。
头文件
#ifndef __LOGIC_H__
#define __LOGIC_H__
#include "test.h"
#if (HAS_SPI)
int test_spi_config(void);
int test_spi_transfer(void);
#endif
#endif /* __LOGIC_H__ */
C 文件
#include "logic.h"
#if (HAS_SPI) /* Wont compile without this */
int test_spi_config(void) {
/* code */
}
#if (HAS_SPI) /* Wont compile without this */
int test_spi_transfer(void) {
/* code */
}
#endif
#endif
【问题讨论】:
-
你必须发布
test.h的内容。还有一种新的保护方法,包括#pragma once。 -
你想用
#ifdef替换#if -
我宁愿看到真正的输出。
-
请注意,标头不提供
test_spi_*()函数的原型;它只提供声明。这些声明说“函数存在;函数返回int;没有关于参数的数量或类型的信息——除了它不使用省略号(...)作为可变参数”。要在 C 中为采用零参数的函数制作原型,您必须编写int test_spi_config(void);和void。 C++ 中的规则不同,但这是一道 C 题。 -
HAS_SPI是如何定义的?#define HAS_SPI 1?-DHAS_SPI=1?-DHAS_SPI?没有定义?值是0而不是1?我的猜测是你没有定义HAS_SPI,所以预处理器把它当作零,而#if 0没有包含来自头文件的声明,也没有在源文件中定义代码。