【问题标题】:Is this C header written properly?这个 C 头文件写得正确吗?
【发布时间】:2015-10-08 16:47:18
【问题描述】:

我正在学习(尝试)如何编写自己的 C/C++ 头文件,并从我的代码主体中获取函数。为此,我编写了 nyanlib.h 和 nyan.cpp

忽略它是一个微不足道的程序,请告诉我标题是否正确编写,或者我是否犯了严重错误?代码虽然有效。

这里是 nyan.cpp:

#include <iostream>
#include <unistd.h>
#include "nyanlib.h"

using namespace std;
int main()
{
    while( true )
        {
            print_nyan(); //function from nyanlib
            sleep(1);
        }
return 0;   
}

Here is nyanlib.h

另外,nyanlib.h 是共享库还是静态库?

【问题讨论】:

  • "另外,nyanlib.h 是共享库还是静态库?"取决于编译器设置。
  • 虽然可以编译和运行,但这不是 .h 和 .cpp 文件的处理方法。作为一般规则,标头应包含声明,.cpp 文件应包含实现。
  • 在头文件中定义函数是不好的做法。将print_nyan() 的定义移动到您的.cpp 文件中,并将其声明保留在标题中。
  • 另外,这是 C++,不是 C。
  • 反对投票的理由:指向标头的外部链接是“此 C 标头是否正确编写?”的症结所在。是一个糟糕的选择。一旦 pastebin 清除或移动该文档,这个问题就完全没用了。

标签: c++ c header shared-libraries static-libraries


【解决方案1】:

你所拥有的 nyanlib.h 应该重命名为 nyanlib.cpp。那么 nyanlib.h 将只包含以下内容:

#ifndef NYANLIB_H
#define NYANLIB_H

void print_nyan();

#endif

然后您可以将库编译为目标文件:

g++ -c nyanlib.cpp

这会给你 nyanlib.o。所以现在你的主文件只包含来自头文件的print_nyan() 的原型,所以它知道如何调用它。

然后你编译主程序:

g++ -c nyan.cpp
g++ -o nyan nyan.o nyanlib.o

【讨论】:

  • 函数去哪儿了?
  • @j0h 函数的定义(包含主体)在 nyanlib.cpp 中。声明(定义参数和返回类型的单行)放在 nyanlib.h 中。
【解决方案2】:

是和不是。虽然它是一个 valid 标头,但您使用它有点奇怪。大多数时候,头文件被用作公开与类相关的方法和变量而不是执行功能的一种方式。

对于你的情况,如果你想让它“更好”,我会将 print_nyan() 函数的实现带入 cpp 文件,并在标题中留下函数的原型。

而且我会说它既不是静态库也不是共享库,因为它有一个主库。如果你想把它变成一个库,你应该创建一个单独的头文件和源文件来定义 print_nyan() 函数,把它变成你的库,然后在你的主函数中使用那个库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2013-02-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多