我有一个包含 3 个文件的文件夹:
- main.c
- 文件1.c
- 文件2.c
这个想法是根据符号(无论是否定义)仅编译一个文件。
在 main.c 中,我添加了以下几行:
#ifdef MY_SYMBOL
#include "file1.c"
#else
#include "file2.c"
#endif
我发现的问题是,当定义 MY_SYMBOL 时,file1.c 被编译两次,因为在 makefile 中提到编译每个文件夹内的所有源文件。
限制是我不应该修改makefile!因此,为了避免这种情况,我将 file1.c 和 file2.c 的扩展名修改为 file1.h 和 file2.h 分别保留它们的内容(所有私有(private)函数的定义),我更新了 main.c 的内容如下:
#ifdef MY_SYMBOL
#include "file1.h"
#else
#include "file2.h"
#endif
考虑到上述限制,最后一个建议是最好的方法吗?
请注意,file1.c 和 file2.c 包含相同的函数,但实现不同。
最佳答案
除此之外,C 程序员通常不希望出现以下情况之一:
- .h-包含函数实现或变量定义的文件
- .c-包含的文件。
所以我想说,通过这两种方式,你都会以某种方式让别人“惊讶”。
如果您不能更改 makefile
(顺便说一句:为什么?),您可以将实现变体封装在预处理器指令内的 .c
文件中:
// file1.c (OR: file_mysym_implementation.c):
#ifdef MY_SYMBOL
// code goes here
#endif
// file2.c (OR: file_non_mysym_implementation.c):
#ifndef MY_SYMBOL
// code goes here
#endif
此外,您还需要一个头文件来声明相应实现公开的所有函数。
关于c - 包含与主 c 文件位于同一文件夹中的 C 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196644/