如何使用单个头文件将 C 实现文件拆分为多个文件
How to split a C implementation file into several files with single header file
我有一个 C/C++ 应用程序,带有一个头文件/实现文件对。
之前:
// ===================================================
// Filename: "bitwise.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
uint16_t word_and
(uint16_t A, uint16_t B)
{
return (A & B);
}
uint32_t dword_and
(uint32_t A, uint32_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B);
uint16_t word_and
(uint16_t A, uint16_t B);
uint32_t dword_and
(uint32_t A, uint32_t B);
// other function's prototypes
// ===================================================
#endif // BITWISE__HPP
// ===================================================
主文件类似这样:
// ===================================================
// Filename: "main.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> myapp headers:
#include "bitwise.hpp"
// ===================================================
int main(int argc, char** argv)
{
int ErrorCode = 0;
// ...
uint8_t A = 7;
uint8_t B = 5;
uint8_t C = byte_and(A, B);
// ...
uint16_t A = 7;
uint16_t B = 5;
uint16_t C = word_and(A, B);
// do something else
// ...
uint32_t A = 7;
uint32_t B = 5;
uint32_t C = dword_and(A, B);
// do something else
// ...
return ErrorCode;
} // int main(...)
// ===================================================
由于"bitwise.cpp"太大了,我想把它分成几个“*.cpp”文件。
并且,保留一个 "bitwise.hpp" 文件,
并且还想要主文件,而不必包含每个特定的实现“*.cpp”文件。
之后(希望实现与此类似的东西):
// ===================================================
// Filename: "bitwise_byte.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_byte.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise_word.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_word.hpp"
// ===================================================
uint16_t word_and
(uint16_t A, uint16_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise_dword.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_dword.hpp"
// ===================================================
uint32_t word_and
(uint32_t A, uint32_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
// include smaller implementation files here (maybe):
// include "bitwise_byte.cpp" or "bitwise_byte.hpp"
// include "bitwise_word.cpp" or "bitwise_word.hpp"
// include "bitwise_dword.cpp" or "bitwise_dword.hpp"
// ===================================================
#endif // BITWISE__HPP
// ===================================================
我没有使用命名空间或外部变量,也没有使用 class 声明,仅使用全局函数。每个单独的实现“*.cpp”文件,
独立于其他。
我希望主文件保持不变,而不必修改其中的"include"。个别“*.cpp”文件可以改,“*.hpp”也可以改。
这可以做到吗?
因为,if (CanBeDone == TRUE)
,怎么办?
我试图查看以前的帖子,但没有找到答案。
[注:我没做完题,我已经有3票反对了,没有解释,看起来像拖钓]
只需将所有函数原型添加到 bitwise.hpp
并将其包含到需要任何函数的所有文件中。
这是它的工作原理,使用@Ari Malinen 的想法,以防有人需要它:
// ===================================================
// Filename: "bitwise_byte.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_byte.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B);
uint16_t word_and
(uint16_t A, uint16_t B);
uint32_t dword_and
(uint32_t A, uint32_t B);
// other function's prototypes
// ===================================================
#endif // BITWISE__HPP
// ===================================================
// ===================================================
// Filename: "bitwise.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise.hpp"
// ===================================================
// Implementation of functions removed.
// ===================================================
"bitwise_*.cpp" 文件,例如 "bitwise_byte.cpp",已从项目中删除。 "mainfile.cpp"保持不变。
使用了其他文件,例如 "bitwise_word.cpp",但没有出现在示例中,以避免使示例难以阅读。
我想避免放置函数原型,而是使用 include 声明,但是,看来,这是不可能的。
我有一个 C/C++ 应用程序,带有一个头文件/实现文件对。
之前:
// ===================================================
// Filename: "bitwise.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
uint16_t word_and
(uint16_t A, uint16_t B)
{
return (A & B);
}
uint32_t dword_and
(uint32_t A, uint32_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B);
uint16_t word_and
(uint16_t A, uint16_t B);
uint32_t dword_and
(uint32_t A, uint32_t B);
// other function's prototypes
// ===================================================
#endif // BITWISE__HPP
// ===================================================
主文件类似这样:
// ===================================================
// Filename: "main.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> myapp headers:
#include "bitwise.hpp"
// ===================================================
int main(int argc, char** argv)
{
int ErrorCode = 0;
// ...
uint8_t A = 7;
uint8_t B = 5;
uint8_t C = byte_and(A, B);
// ...
uint16_t A = 7;
uint16_t B = 5;
uint16_t C = word_and(A, B);
// do something else
// ...
uint32_t A = 7;
uint32_t B = 5;
uint32_t C = dword_and(A, B);
// do something else
// ...
return ErrorCode;
} // int main(...)
// ===================================================
由于"bitwise.cpp"太大了,我想把它分成几个“*.cpp”文件。
并且,保留一个 "bitwise.hpp" 文件, 并且还想要主文件,而不必包含每个特定的实现“*.cpp”文件。
之后(希望实现与此类似的东西):
// ===================================================
// Filename: "bitwise_byte.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_byte.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise_word.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_word.hpp"
// ===================================================
uint16_t word_and
(uint16_t A, uint16_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise_dword.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_dword.hpp"
// ===================================================
uint32_t word_and
(uint32_t A, uint32_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
// include smaller implementation files here (maybe):
// include "bitwise_byte.cpp" or "bitwise_byte.hpp"
// include "bitwise_word.cpp" or "bitwise_word.hpp"
// include "bitwise_dword.cpp" or "bitwise_dword.hpp"
// ===================================================
#endif // BITWISE__HPP
// ===================================================
我没有使用命名空间或外部变量,也没有使用 class 声明,仅使用全局函数。每个单独的实现“*.cpp”文件, 独立于其他。
我希望主文件保持不变,而不必修改其中的"include"。个别“*.cpp”文件可以改,“*.hpp”也可以改。
这可以做到吗?
因为,if (CanBeDone == TRUE)
,怎么办?
我试图查看以前的帖子,但没有找到答案。
[注:我没做完题,我已经有3票反对了,没有解释,看起来像拖钓]
只需将所有函数原型添加到 bitwise.hpp
并将其包含到需要任何函数的所有文件中。
这是它的工作原理,使用@Ari Malinen 的想法,以防有人需要它:
// ===================================================
// Filename: "bitwise_byte.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise_byte.hpp"
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B)
{
return (A & B);
}
// other function's implementations
// ===================================================
// ===================================================
// Filename: "bitwise.hpp"
// ===================================================
#ifndef BITWISE__HPP
#define BITWISE__HPP
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
// ???
// ===================================================
uint8_t byte_and
(uint8_t A, uint8_t B);
uint16_t word_and
(uint16_t A, uint16_t B);
uint32_t dword_and
(uint32_t A, uint32_t B);
// other function's prototypes
// ===================================================
#endif // BITWISE__HPP
// ===================================================
// ===================================================
// Filename: "bitwise.cpp"
// ===================================================
// --> "C" specific headers:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// ===================================================
// --> same header:
#include "bitwise.hpp"
// ===================================================
// Implementation of functions removed.
// ===================================================
"bitwise_*.cpp" 文件,例如 "bitwise_byte.cpp",已从项目中删除。 "mainfile.cpp"保持不变。
使用了其他文件,例如 "bitwise_word.cpp",但没有出现在示例中,以避免使示例难以阅读。
我想避免放置函数原型,而是使用 include 声明,但是,看来,这是不可能的。