Tá»p H là gì?
Tá»p ÄÆ°á»£c lưu vá»i phần má» rá»ng tá»p h là tá»p tiêu Äá» ÄÆ°á»£c sá» dụng trong tá»p C/C++ Äá» bao gá»m phần khai báo biến, hằng và hà m. Chúng ÄÆ°á»£c giá»i thiá»u bá»i các tá»p triá»n khai C++ có chứa triá»n khai thá»±c tế cá»§a các chức nÄng nà y. Tá»p tiêu Äá» .h cÅ©ng có thá» bao gá»m thông tin bá» sung, chẳng hạn như Äá»nh nghÄ©a Macro. Các tá»p tiêu Äá» nà y ÄÆ°á»£c tham chiếu trong các tá»p C/C++ bằng chá» thá» #include.
Má»t dá»± án C++ má»i thưá»ng chứa má»t tá»p tiêu Äá» Äặc biá»t có tên tá»p stdafx.h là Äiá»m bắt Äầu cho tất cả các chuá»i biên dá»ch và tất cả các tá»p tiêu Äá» có thá» ÄÆ°á»£c bao gá»m trong tá»p duy nhất nà y. Có thá» má» tá»p .h bằng bất kỳ trình soạn thảo vÄn bản nà o, Eclipse IDE, Microsoft Visual Studio IDE, trình biên dá»ch Borland C++ và nhiá»u ứng dụng khác.
Äá»nh dạng tá»p .H
Tá»p .h là tá»p vÄn bản thuần túy có các quy tắc riêng Äá» xác Äá»nh cú pháp. Tá»p tiêu Äá» có thá» chứa các thông tin sau.
Biến - Trong trưá»ng hợp Láºp trình hưá»ng Äá»i tượng (OOP), tá»p tiêu Äá» lá»p chứa các Äá»nh nghÄ©a vá» tất cả các biến cấp lá»p có thá» truy cáºp qua các tá»p mã nguá»n triá»n khai
Tuyên bá» phương thức - Tất cả các khai báo phương thức ÄÆ°á»£c bao gá»m trong tá»p tiêu Äá» .h Äá» có thá» truy cáºp ÄÆ°á»£c trên nhiá»u tá»p triá»n khai.
Äá»nh nghÄ©a hà m không ná»i tuyến - Các tá»p tiêu Äá» cÅ©ng có thá» chứa Äá»nh nghÄ©a cá»§a má»t phương thức không ná»i tuyến.
Bản Äá» thông báo - Má»t tá»p tiêu Äá» cÅ©ng có thá» chứa các bản Äá» thông báo trong trưá»ng hợp triá»n khai mã nguá»n MFC. Trong trưá»ng hợp như váºy, bản Äá» thông báo ÄÆ°á»£c liên kết vá»i viá»c triá»n khai chức nÄng ÄÆ°á»£c liên kết vá»i các thà nh phần giao diá»n ngưá»i dùng như nút, há»p kiá»m, nút radio, v.v.
Bảo vá» tiêu Äá»
Các tá»p tiêu Äá» có thá» dẫn Äến các lá»i phức tạp khi nhiá»u khai báo ÄÆ°á»£c ÄÆ°a và o cùng má»t tá»p do thêm các tá»p tiêu Äá» khác. Äá»nh nghÄ©a trùng lặp nà y là m tÄng lá»i trình biên dá»ch. Tình huá»ng có vấn Äá» nà y có thá» tránh ÄÆ°á»£c thông qua má»t cÆ¡ chế ÄÆ°á»£c gá»i là bảo vá» tiêu Äá» là các chá» thá» biên dá»ch có Äiá»u kiá»n như ÄÆ°á»£c hiá»n thá» bên dưá»i.
#ifndef ANY_UNIQUE_NAME_HERE
#define ANY_UNIQUE_NAME_HERE
// your declarations (and certain types of definitions) here
#endif
Vá»i tiêu Äá» nà y, bá» tiá»n xá» lý sẽ kiá»m tra xem ANY_UNIQUE_NAME_HERE Äã ÄÆ°á»£c xác Äá»nh chưa. Nếu tiêu Äá» ÄÆ°á»£c ÄÆ°a và o cùng má»t tá»p nhiá»u lần, ná»i dung cá»§a tiêu Äá» sẽ bá» bá» qua.
Và dụ tá»p H
// sample.h
#pragma once
#include <vector> // #include directive
#include <string>
namespace N // namespace declaration
{
inline namespace P
{
//...
}
enum class colors : short { red, blue, purple, azure };
const double PI = 3.14; // const and constexpr definitions
constexpr int MeaningOfLife{ 42 };
constexpr int get_meaning()
{
static_assert(MeaningOfLife == 42, "unexpected!"); // static_assert
return MeaningOfLife;
}
using vstr = std::vector<int>; // type alias
extern double d; // extern variable
#define LOG // macro definition
#ifdef LOG // conditional compilation directive
void print_to_log();
#endif
class my_class // regular class definition,
{ // but no non-inline function definitions
friend class other_class;
public:
void do_something(); // definition in my_class.cpp
inline void put_value(int i) { vals.push_back(i); } // inline OK
private:
vstr vals;
int i;
};
struct RGB
{
short r{ 0 }; // member initialization
short g{ 0 };
short b{ 0 };
};
template <typename T> // template definition
class value_store
{
public:
value_store<T>() = default;
void write_value(T val)
{
//... function definition OK in template
}
private:
std::vector<T> vals;
};
template <typename T> // template declaration
class value_widget;
}