Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [VC++6.0]Help: Tạo tệp .h xài nhiều lần

  1. #1
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Post [VC++6.0]Help: Tạo tệp .h xài nhiều lần

    Tui tạo 1 tệp .h và gán cho nó :
    #ifndef __TEP_H__
    #define __TEP_H__


    void Ham1(int a, int b)
    {
    .....// Xu li ham 1
    }

    void Ham2(int c, int d)
    {
    .....// Xu li ham 2
    }

    ........

    #endif


    Với cách này thì tui có thể khai báo tới tận 2 cái #include <tep.h> trong cùng một tệp .cpp cũng chẳng sao. Nhưng khi khai báo #include <tep.h> trong một tệp khác trong project thì nó báo lỗi ( Hàm 1, Hàm 2,.. đã tồn tại ).
    Rất mong chỉ giáo cách khắc phục !

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    2 cách:
    - đề nhị tách hiện thực ra file .cpp
    - hoặc inline tất cả các hàm trong file .h
    inline void Ham1(int a, int b)

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Trích dẫn Nguyên bản được gửi bởi hieubm
    Còn cái tách hiện thực ra file .cpp thì tớ chưa hiểu. Mong giúp đỡ.

    Nghĩa là bác để phần prototype của nó trong header file, còn phần thân hàm thì để trong một source file riêng.

    VD:
    Code:
    //The content of filename.h 
    #ifndef _FILENAME_H
    #define _FILENAME_H
    return_type function_name (parameter list);
    #endif
    Phần thân hàm để riêng sang một file khác

    Code:
    //The content of filename.cpp
    #include "filename.h"
    return_type function_name (parameter list)
    {
       //how does it work ?
    }
    Our dreams are young and we both know they take us where we want to go...

  4. #4
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Các bác ơi ! Cái cách để prototype trong header và để nội dung hàm trong tệp .cpp thì tui đã nghĩ ra từ lâu rồi. Có điều, cái cách này ta phải add cái file .cpp đó vào project thì mới chạy được. Nhưng tui thấy tệp windows.h , trong đó toàn là prototype nhưng nó vẫn có thể chạy ở ất cứ nơi nào, dùng bao nhiêu lần trong 1 project cũng được, không cần phải add thêm một cái windows.cpp nào nào đó vào project cả. Tui muốn làm một cái header như vậy ! Rất mong các bác chỉ bảo ! Thanks

  5. #5
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Hic hic ! Khó nói quá ! Tình hình là thế này :
    Trong 1 project, tui có tep1.cpp và tep2.cpp. Trong tep1.cpp, tui để #include <header.h> ; rồi tep2.cpp tui cũng để #include <header.h>. Khi dịch, máy báo lỗi : "Hàm xyz() đã tồn tại". Nhưng nếu bỏ cái #include <header.h> ở tep2.cpp ra thì nó lại nói : "Không hiểu hàm xyz() là cái gì".

    Rút cục là thế đó, tui muốn #include <header.h> ở cái 2 tệp tep1.cpp và tep2.cpp.

    Bác nguyentuan2 chỉ cách dùng inline với các hàm trong tệp header. Tui làm và thấy hiệu nghiệm, tuy nhiên nghe nói inline làm nặng chương trình. Nay tui muốn tìm cách khác mà vẫn thỏa mãn yêu cầu trên. Mong bác Dreaminess nhiệt tình chỉ giúp.

  6. #6
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Mặc định [VC++6.0]Help: Tạo tệp .h xài nhiều lần

    Tôi hiểu rồi. Chắc là bác muốn viết chương trình trên nhiều module và sử dụng lại những gì mình đã viết cho một chương trình khác. Nếu bác làm trong VC++ (hay bất cứ một IDE nào khác) thì cần để ý đến cái gọi là "pre-compiled header - pch file" và cách đưa vào các tùy chọn khi liên kết (chủ yếu là để add thêm các file đối tượng đã có sẵn vào project). Dưới đây là ví dụ về cách viết một chương trình có 2 module (DevC++):

    Chương trình gồm 06 file như sau:
    Code:
    main.cpp --> main prog
    module1.h & module1.cpp --> module1 built here
    module2.h & module2.cpp --> module2 built here
    precomp.h --> precompile header
    precomp.cpp --> used for enable precompile header
    module1.h
    Code:
    #ifndef _MODULE1_H
    #define _MODULE1_H
    namespace module1 
    {
        int cube ( int );
    } 
    #endif
    module1.cpp
    Code:
    #include "precomp.h"
    namespace module1
    {
        int cube ( int iValue )
        {
            return iValue * iValue * iValue;
        }
    }
    module2.h
    Code:
    #ifndef _MODULE2_H
    #define _MODULE2_H
    namespace module2
    {
        int sqr( int );
    }
    #endif
    module2.cpp
    Code:
    #include "precomp.h"
    namespace module2
    {
        int sqr (int iValue)
        {
            return iValue * iValue;
        }
    }
    precomp.h
    Code:
    #ifndef _PRECOMP_H
    #define _PRECOMP_H
    #include "module1.h"
    #include "module2.h"
    #endif
    precomp.cpp
    Code:
    //precompiled header enabled
    #include "precomp.h"
    main.cpp
    Code:
    #include <cstdlib>
    #include <iostream>
    #include "precomp.h" //precompiled header contains module1 & module2
    
    #ifndef EXIT_SUCCESS
    #define EXIT_SUCCESS 0
    #endif
    
    #ifndef EXIT_FAILURE
    #define EXIT_FAILURE 1
    #endif
    
    using namespace std; 
    using namespace module1; 
    using namespace module2; 
    //Or you can write 
    //using std::cout; --> service provided by std 
    //using module1::cube; --> service provided by module1
    //using module2::sqr; --> service provided by module2
    
    int main(int argc, char *argv[])
    {
        cout << "This is an example of writting a program using multiple modules." << endl;
        cout << "\"sqr\" service provided by module2" << " " << sqr(3) << endl;
        cout << "\"cube\" service provided by module1" << " " << cube(3) << endl;
        system ("PAUSE");
        return EXIT_SUCCESS;
    }
    Để tái sử dụng các module đã viết cho một project khác, sau khi biên dịch và chạy thành công chương trình, bạn vào thư mục chứa project và sẽ thấy các file đối tượng (object file - *.o) là precomp.o, module1.o và module2.o --> copy bọn này vào một thư mục khác (không bắt buộc nhưng nên làm thế cho rõ ràng), có thể là của project mới cũng đc.

    Đưa các file *.h vào thư mục include chuẩn (#include <..> khi sử dụng) or thư mục của proj mới (#include "..") - chú ý cặp dấu <> và "". Nên đưa vào thư mục chuẩn nếu bạn sử dụng thường xuyên.

    Đưa thêm các tùy chọn liên kết để sử dụng các file obj đã có (trong DevC++ tôi vào project --> project options --> parameter --> add library or object (linker)). Các file này cũng nên đưa vào thư mục lib chuẩn nếu dùng thường xuyên.

    Or sửa makefile
    VD:
    LIBS = -L"C:/Dev-Cpp/lib" ../lib/precomp.o ../lib/module2.o ../lib/module1.o

    (../lib/filename.o là đường dẫn tương đối, bác có thể chỉ cụ thể, e.g C:/file.o)

    Mã nguồn của proj có LIBS như ở trên:

    Code:
    #include <cstdlib>
    #include <iostream>
    #include <precomp.h>
    
    
    using namespace std;
    using namespace module1;
    using namespace module2;
    
    int main(int argc, char *argv[])
    {
        cout << sqr (3) << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    chú ý:
    [1] chỉ include precomp.h là đủ vì nó đã include các file cần thiết khác (module1.h và module2.h).
    [2] precomp.h không phải là precompiled header cho ứng dụng mới này (phải tạo một precomp khác nếu cần)
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 16-01-2007 lúc 02:36 AM.
    Our dreams are young and we both know they take us where we want to go...

  7. #7
    Ngày gia nhập
    01 2007
    Nơi ở
    Chuồng gà
    Bài viết
    8

    Theo lập trình truyền thống thì người ta khai báo prototype trong file .h, và cài đặt thân hàm trong file .cpp. Rồi muốn sử dụng trong tệp khác thì chỉ việc include cái .h đấy vào.
    Nếu chỉ muốn sử dụng mỗi cái .h thôi, thì phải build thêm cái thư viện static .lib nữa. Muốn sử dụng chỉ cần add .lib vào link của chương trình và include .h vào.
    Nếu muốn build dạng thư viện động thì nó sẽ tạo ra 2 thư viện .lib và .dll.
    .lib sẽ chứa prototype(kích thước nhỏ), .dll chứa cài đặt(kích thước lớn hơn). Khi chạy cần đưa .dll vào cùng thư mục với .exe.
    Ưu điểm của .dll là tiết kiệm bộ nhớ chương trình.

  8. #8
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    He he ! Thành công rồi các bác ơi ! Nói túm đi, túm lại là phải Tạo một new project : Win32 Static Library.
    Sau đó tạo 1 tệp header.h chứa prototype.
    Một tệp .cpp có #include "header.h" và chứa nội dung hàm.
    Sau đó dịch cái project này.
    Nó sẽ tạo ra header.lib trong thư mục Debug.
    Copy header.lib này vào thư mục Lib của VC++.
    Copy cái header.h vào thư mục Include của VC++.

    Trong project của mình thì vô Project > Setting > tab Link, thêm vào header.lib. Trong phần khai báo thêm #include <header.h>

    Thế là thỏa mãn yêu cầu của em và đồng thời em đã hiểu bản chất mấy cái header trong thư mục Include. He he ! Đơn giản vậy thôi mà các bác nói cứ làm em khó xử quá. Có lẽ cảm ơn nhất là bạn dzung249, tuy bạn nói qua loa, khó hiểu nhưng đã giúp tớ khám phá ra cách làm như trên. Cảm ơn mọi người, cảm ơn Viet C Club.

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    1

    Cảm ơn tất cả các pác,nhờ vào đâym à em hiểu thêm được bao nhiêu thứ hi hi

Các đề tài tương tự

  1. Focus chuột vào nhiều cửa sổ ( dạng viết auto game nhiều cửa sổ cùng lúc )
    Gửi bởi hoanghiep9x trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 13-07-2012, 10:28 PM
  2. Thêm và Sửa Table có quan hệ nhiều nhiều trong mô hinh MVC như thế nào?
    Gửi bởi minhchi trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 3
    Bài viết cuối: 26-05-2012, 04:32 PM
  3. Cập nhật nhiều Gridview vào nhiều datatable trong Dataview
    Gửi bởi MYNAM trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 10-07-2011, 12:08 PM
  4. chọn nhiều Properties checked cho nhiều radio trong 1 fomm
    Gửi bởi lotus88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 06-06-2011, 05:34 PM
  5. Nhiệt âm kế, đo nhiệt độ, độ ẩm trong phòng,call 0979109862
    Gửi bởi kinhdoanhhv_02 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-05-2011, 11:24 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn