.h编写


通用.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