c - 包含与主 c 文件位于同一文件夹中的 C 文件

标签 c preprocessor-directive

我有一个包含 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.cfile2.c 的扩展名修改为 file1.hfile2.h 分别保留它们的内容(所有私有(private)函数的定义),我更新了 main.c 的内容如下:

#ifdef MY_SYMBOL
 #include "file1.h"
#else
 #include "file2.h"
#endif

考虑到上述限制,最后一个建议是最好的方法吗?

请注意,file1.cfile2.c 包含相同的函数,但实现不同。

最佳答案

除此之外,C 程序员通常不希望出现以下情况之一:

  1. .h-包含函数实现或变量定义的文件
  2. .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/

相关文章:

c - -fcatch-undefined-behavior 只捕获大于 1 个元素的本地数组访问

c - 在磁盘上分配文件而不清零

c - 如何打开具有两个不同端口的 UDP 套接字?

c-preprocessor - 预处理器指令 : #elif not defined?

c-preprocessor - 为什么有人会使用#if 1 C 预处理器指令?

你能知道 free() 在 C 中是否成功而不崩溃吗?

c - 是否可以更快地对 0's 1' 求和?

c# - 如何在 C# 中使用预处理器指令仅在 Windows 10 上执行一些代码?

c - 头文件的排除是否是语法错误的一部分?

c++ - #if/#endif 预处理指令