代码之家  ›  专栏  ›  技术社区  ›  Matthew

将预编译头与静态库项目一起使用

  •  1
  • Matthew  · 技术社区  · 13 年前

    我需要一些关于如何设置我的项目的建议。我正在构建一个静态库,想知道我使用预编译头的方式是否正确,然后再做太多的工作。

    到目前为止,我的STDAFX文件只包括(对于DWORD等类型)和(STD::字符串)。

    我构建了一个名为testfuncs.cpp/h的简单cpp/header组合

    测试函数.cpp:

    #include "stdafx.h"
    using namespace std;
    void MyFunc(DWORD a, string b) {
        // irrelevant
    }
    

    测试功能.h

    #pragma once
    void MyFunc(DWORD a, std::string b);
    

    这里的代码可以正确编译。我遇到的问题是,当我想在另一个项目中使用这个静态库时,我通常会做包括“path-to-u-my-static-lib-project/testfuncs.h”

    但是,这个问题是基于testfuncs.h的,此时dword和string都是未知的,因为它们是从stdafx.h文件定义的类型。

    我提出的一个解决方案(我不知道这样做是正确的)就是在一次pragma之后在testfuncs.h的顶部包含stdafx.h。现在项目是否使用预编译头来工作文件。

    这是应该怎么做,还是有一个适当的方法来做?

    谢谢您。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Matthias Pandu    6 年前

    不要 #include "stdafx.h" 在库的公共头文件中。公共头文件是指您的库的客户机将要使用的头文件 #include .

    相反,只定义绝对最小值,最好在此文件中使用100%可移植代码。如果您的库将被不同的编译器或平台使用,也要避免使用STL。

    所以假设您有一个公共头文件 my_library.h gizmo.cpp . 您将拥有以下功能:

    小控件.cpp

    #include "stdafx.h"
    #include "my_library.h"
    
    int GizmoTronic()
    { 
      // ...
      return 42;
    }
    

    另外,主题外,但使用宏保护而不是 #pragma once 它不是C++语言的一部分,因此不受所有编译器的支持。这是一个不好的习惯。

    编辑:

    关于 DWORD string 当标题为 #包括 -Ed,我有3个建议:

    1)仅使用可移植数据类型。也就是说,标准定义的数据类型。 小精灵 是微软的发明(几十年前)。它不是语言的一部分,也不可移植。相反,使用 unsigned long 或者其他合适的东西。

    2)不要使用 一串 如果您的库将由编译程序以外的其他编译器编译的代码使用,则在您的库的公共接口中。原因是 一串 完全在头文件中定义,因此每个编译器可能都有自己的实现。一个编译器 一串 可能看起来和别人不一样。

    3)假设2不适用,请随意 #包括 任何必要的标题 从标准库 在你的头顶。如果你使用 一串 在公共界面中, #include <string> 在你的头上。(只是请不要 using namespace std )您的头应该是独立的。

    编辑2:

    以下是我如何声明您的函数:

    void MyFunc(unsigned long a, const char* b);