通用.h
h
#ifndef MYLIB_H // ① 头文件保护,防重复包含
#define MYLIB_H
/* ② 版本与可见性控制(跨平台导出/导入符号) */
#if defined(_WIN32) || defined(__CYGWIN__)
#ifdef MYLIB_BUILD // 编库时在编译选项里定义 MYLIB_BUILD
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif
#else
#define MYLIB_API __attribute__((visibility("default")))
#endif
/* ③ 让 C 的头对 C++ 也友好(防止符号被 C++ 改名) */
#ifdef __cplusplus
extern "C" {
#endif
/* ④ 前置声明(尽量减少 #include 依赖) */
struct MylibContext; // 不暴露内部字段,实现信息隐藏(不透明指针)
/* ⑤ 常量、枚举、错误码 */
#define MYLIB_OK 0 // 简单宏常量
#define MYLIB_ERR -1
typedef enum {
MYLIB_MODE_A = 0,
MYLIB_MODE_B = 1,
} mylib_mode_t; // 强类型枚举习惯用 typedef
/* ⑥ 公有API的函数声明(不要在头里放非 inline 的函数定义) */
MYLIB_API struct MylibContext* mylib_create(mylib_mode_t mode);
/* 中文注释:创建上下文,返回指针,失败返回 NULL */
MYLIB_API void mylib_destroy(struct MylibContext* ctx);
/* 中文注释:销毁上下文,传入由 mylib_create 返回的指针 */
MYLIB_API int mylib_add(struct MylibContext* ctx, int a, int b);
/* 中文注释:示例函数,加法,返回结果或错误码 */
/* ⑦ 可选:小函数可用 static inline 放头里(仅限极短小、且无 ODR 风险) */
static inline int mylib_is_ok(int code) {
return code == MYLIB_OK;
}
/* 中文注释:内联小工具函数,放头里减少调用开销且不会多重定义 */
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* MYLIB_H */
通用.hpp
hpp
#pragma once // ① 现代写法,等价于 include guard
#include <cstdint> // ② 只包含你必须要的标准头;避免过多依赖
#include <vector>
// ③ 禁止在头里写 using namespace std; 以免污染全局命名空间
namespace mylib { // ④ 放进自有命名空间,避免符号冲突
// ⑤ 类声明(接口);实现放 .cpp;短小函数可放内联定义
class Adder {
public:
// 构造/析构(必要时=default/=delete)
Adder() = default;
~Adder() = default;
// 拷贝/移动(按需要显式声明)
Adder(const Adder&) = default;
Adder& operator=(const Adder&) = default;
Adder(Adder&&) noexcept = default;
Adder& operator=(Adder&&) noexcept = default;
// 成员函数声明
int add(int a, int b) const noexcept; // 只在头里声明
};
// ⑥ 模板或 inline/constexpr 通常需要放头里(实例化/编译期计算需要可见实现)
template <typename T>
inline T sum(const std::vector<T>& v) {
T s{};
for (const auto& x : v) s += x;
return s;
}
/* 中文注释:模板需要在使用点看到实现,所以放头文件;短函数可 inline */
} // namespace mylib