5

Tôi hơi bối rối vào lúc này vì tôi dự định bao gồm nhiều tệp nguồn và tiêu đề lần đầu tiên trong một trong các dự án của tôi.
Vì vậy, tôi tự hỏi liệu đây có phải là phương pháp phù hợp không?
Tôi có phải bao gồm tiêu đề chuỗi trong mọi tệp nguồn sử dụng trực tiếp không?
Và điều gì về tiêu đề "stdafx.hpp" mà Visual C++ muốn tôi đưa vào?C++ Tôi có phải bao gồm các thư viện chuẩn cho mọi tệp nguồn không?

Đó có phải là con đường để đi không?

main.cpp

#include "stdafx.hpp" 
#include <string> //? 
#include <stringLib1.h> 
#include <stringLib2.h> 
using std::string; 

//use a windows.h function here 
//use a stringLib1 function here 
//use a stringLib2 function here 

stringLib1.h

#include "stdafx.hpp" 
#include <string> 
using std::string; 

class uselessClass1 
{ 
public: 
    string GetStringBack1(string myString); 
}; 

stringLib1.cpp

#include "stdafx.hpp" 

string uselessClass1::GetStringBack1(string myString) { 
    return myString; 
} 

stringLib2.h

#include "stdafx.hpp" 
#include <string> 
using std::string; 

class uselessClass2 
{ 
public: 
    string GetStringBack2(string myString); 
}; 

stringLib2.cpp

#include "stdafx.hpp" 

string uselessClass2::GetStringBack2(string myString) { 
    return myString; 
} 
+7

Có bạn phải bao gồm các tệp tiêu đề trong mọi tệp bạn muốn sử dụng. Tuy nhiên, bạn không nên sử dụng từ khóa 'using' trong tiêu đề. Đây không phải là phong cách tốt. –

+0

@ user2572585 Ai cho biết về phong cách? – nbro

+2

@cell Tôi hy vọng đó là một lời nhận xét mỉa mai và bạn không nghiêm túc. – CoryKramer

Trả lời

0

Các stdafx bao gồm nên ở phía trên cùng của mỗi tập tin cpp và nó KHÔNG phải ở trong file .h. Bạn có thể đặt #include < chuỗi> trong stdafx.h nếu bạn không muốn đặt nó trong mọi tệp khác.

+0

Bạn * có thể * dựa vào stdafx để cung cấp cho bạn tiêu đề phổ biến và chắc chắn rất nhiều nhà phát triển làm, nhưng tôi ước họ sẽ không (và tôi muốn có một chuyển đổi VS để xem xét lỗi này). Vấn đề là nó làm cho nó khó khăn để tái sử dụng các tập tin giữa các dự án khác nhau vì mỗi sẽ có một stdafx khác nhau. – dlf

+0

Đúng, nhưng bạn có thể dễ dàng thêm các tiêu đề bị thiếu khi gặp phải lỗi không? – XTF

+0

Có, nhưng nếu đó là một người khác trong một bộ phận khác nhau làm việc trên một dự án khác nhau xảy ra để chia sẻ mã với bạn của những người làm cho phát hiện, tình hình trở thành chính trị! :) – dlf

-1

Tôi cho rằng bạn phải có các tệp tiêu đề của riêng bạn cũng có thể yêu cầu tệp cpp và tệp tiêu đề khác. Giống như trang bạn đã cung cấp

#include <stringLib1.h> 
#include <stringLib2.h> 

Theo tôi, tốt hơn nên tạo một tệp tiêu đề chung mà bạn bao gồm tất cả tệp tiêu đề thư viện chung và tệp tiêu đề dự án của bạn. Tệp này sau đó bạn có thể bao gồm trong tất cả các tệp cpp và tệp tiêu đề khác. Và nó sẽ tốt hơn để sử dụng vệ sĩ tiêu đề cũng có.

Vì vậy, hãy xem xét một tệp tiêu đề chung "includes.h".

#ifndef INCLUDES_H 
#define INCLUDES_H 

#include <string> 

#include <stringLib1.h> 
#include <stringLib2.h> 

/***Header files***/  

#endif //INCLUDES_H 

Đây là tệp tiêu đề chung của bạn. Điều này bạn có thể bao gồm trong tất cả các tập tin dự án của bạn.

+2

Thật là một ý tưởng đáng sợ. Trừ khi bạn đang biên dịch trước tiêu đề này, tại sao trên trái đất bạn sẽ không cần thiết bao gồm tất cả các tiêu đề trong mọi đơn vị dịch? –

+0

Tôi cho rằng bạn đã không bao giờ làm việc trên một dự án C++ lớn .. ý tưởng này sớm chứng minh được địa ngục trên trái đất –

+0

Như một vấn đề của thực tế, trong công ty của tôi cách tiếp cận này được theo sau. Và vì các bạn đã chỉ ra rằng đây không phải là một cách tiếp cận tốt, tôi sẽ xem xét nó nhiều hơn nữa. Cảm ơn. – Arpit

3
  1. Thực tiễn tốt thường chỉ bao gồm những gì mã của bạn sử dụng trong mọi tệp. Làm giảm sự phụ thuộc vào tiêu đề khác và các dự án lớn, làm giảm thời gian biên dịch (và cũng có thể giúp tìm hiểu những gì phụ thuộc vào những gì)

  2. Sử dụng include guards trong các tập tin tiêu đề của bạn

  3. Đừng import mọi thứ bởi polluting sự không gian tên chung, ví dụ

    using namespace std; 
    

    mà là hội đủ điều kiện những gì bạn có ý định sử dụng khi bạn cần đến nó

  4. Bạn không cần stdafx.h trong dự án của bạn unless you're using precompiled headers. Bạn có thể kiểm soát hành vi này trong các thuộc tính dự án VS (C/C++ -> precompiled Headers -> precompiled Tiêu đề)

3

Tiêu đề stdafx.h là cần thiết nếu tiêu đề biên dịch sẵn được kích hoạt trong VS. (Read this one) Bạn chỉ cần bao gồm stdafx.h trong các tệp .cpp của mình làm bao gồm lần đầu tiên.

Về tệp tiêu đề và cpp (theo cặp), bao gồm những thứ cần thiết cho khai báo trong tiêu đề và bao gồm mọi thứ khác (cần thiết cho định nghĩa) trong cpp. Cũng bao gồm các tiêu đề tương ứng trong cặp cpp của nó quá. Và sử dụng include guards.

myclass.h

#ifndef MYCLASS_H // This is the include guard macro 
#define MYCLASS_H 

#include <string> 
using namespace std; 

class MyClass { 
    private: 
     string myString; 
    public: 
    MyClass(string s) {myString = s;} 
    string getString(void) {return myString;} 
    void generate(); 
} 

MyClass.cpp

#include <stdafx.h> // VS: Precompiled Header 
// Include the header pair 
#include "myclass.h" // With this one <string> gets included too 
// Other stuff used internally 
#include <vector> 
#include <iostream> 

void MyClass::generate() { 
    vector<string> myRandomStrings; 
    ... 
    cout << "Done\n"; 
} 

#endif 

Sau đó, trong main(...), bạn có thể chỉ bao gồm myclass.h và gọi generate() chức năng.

Các vấn đề liên quan