typedef
ãã®èšäºã¯æ€èšŒå¯èœãªåèæç®ãåºå
žãå
šã瀺ãããŠããªãããäžååã§ãã (2025幎10æ) |
typedefïŒã¿ã€ãããïŒã¯ãããã°ã©ãã³ã°èšèªã®Cããã³C++ã«ãããããŒã¯ãŒãïŒäºçŽèªïŒã§ããããã®ããŒã¯ãŒãã¯ããŒã¿åã«æ°ããååïŒãšã€ãªã¢ã¹ãã·ããã ïŒãã€ããããã«äœ¿çšããããããã°ã©ãã容æã«ãœãŒã¹ã³ãŒããèšè¿°ã»çè§£ã§ããããã«ããããšãç®çã§ããã
䜿çšäŸ
[ç·šé]ãŸãtypedefã䜿ããªãäŸã瀺ãã
int is_even_number(int x) {
return x % 2 == 0;
}
ãã®é¢æ°ã¯å
¥åxãå¶æ°ã§ããã°1ãã奿°ã§ããã°0ãè¿ããããããæ¬¡ã®ããã«intåã®å¥åãšããŠè«çåïŒããŒãªã¢ã³åïŒãå®çŸ©ãã颿°ã®æ»ãå€ã®åã®ååãšããŠäœ¿çšããããšã§ãæ»ãå€ã®æå³ãæç¢ºåã§ããã
typedef int my_boolean_t;
my_boolean_t is_even_number(int x) {
return x % 2 == 0;
}
çåœå€ (boolean) ã¯éäŸ0ãåœã0以å€ãçãšããããšããã颿°ã®ä»æ§ãããæç¢ºãšãªã£ãŠãã[泚é 1]ããµãã£ãã¯ã¹_tã¯ãtypedefã«ããåãšã€ãªã¢ã¹ã§ããããšãåãããããããããã«ä»ããããããšãå€ãïŒsize_tãtime_tãªã©ïŒã
ãŸããtypedefã¯é·å€§ã§è€éãªååãåçŽåããããã«çšããããããšãããã
typedef unsigned char byte;
typedef unsigned long long ulonglong;
byte vb = UCHAR_MAX;
ulonglong vull = ULLONG_MAX;
次ã«ãæ§é äœã䜿ã£ãäŸã瀺ãã
struct my_struct {
int data1;
int data2;
char data3;
};
ããã§ã¯ããŠãŒã¶ãŒå®çŸ©ã®åmy_structãå®çŸ©ãããŠãããmy_structåã®å€æ°ã宣èšããããã«ãCèšèªã§ã¯ä»¥äžã®ããã«structããŒã¯ãŒããå¿
èŠã§ããã
struct my_struct a;
my_struct b; /* æ§æãšã©ãŒ */
ããã§ãæ§é äœå®£èšã®åŸã«ã以äžã®è¡ã远å ããŠã¿ãã
typedef struct my_struct my_struct_t;
ããã«ãããmy_structåã®å€æ°ã宣èšããããã«ã¯ã以äžã®ã³ãŒãã§ååãšãªãã
my_struct_t a;
åãããšã¯ã以äžã®ã³ãŒãã§ãè¡ãããšãã§ããã
typedef struct my_struct {
int data1;
int data2;
char data3;
} my_struct_t;
æ§é äœã®ã¿ã°åãçç¥ããããšãã§ããããã®å Žåãã¿ã°åã¯åŠçç³»ã«ãã£ãŠèªåçæãããã
typedef struct {
int data1;
int data2;
char data3;
} my_struct_t;
æ§é äœã®ã¿ã°åãšå¥åãåäžã«ããããšãã§ããã
typedef struct my_struct_t {
int data1;
int data2;
char data3;
} my_struct_t;
以äžã®typedef掻çšã¯æ§é äœã ãã«éãããå
±çšäœunionãåæåenumã®å®çŸ©æã«ãåæ§ã«é©çšå¯èœã§ããã
typedefã¯ãèªå·±åç
§æ§é äœãžã®ãã€ã³ã¿ã®äœæãç°¡åã«ããããšãã§ããã以äžã«ã³ãŒãäŸã瀺ãã
typedef struct node_tag node_t;
struct node_tag {
node_t *nextptr;
int data;
};
éåžžãããåã®ãã€ã³ã¿å倿°ã宣èšããéãããããã®å€æ°åã®åã«ã¢ã¹ã¿ãªã¹ã¯*ãèšè¿°ããå¿
èŠãããã
node_t *startptr, *endptr, *curptr, *prevptr, errptr, *refptr;
ããã°ã©ãã¯errptrããã€ã³ã¿ånode_t *ã§ããããšãæ³å®ããŠããããtypoã«ããerrptrã¯å€ånode_tã§ãããšå®çŸ©ãããŠããŸã£ãŠãããããã¯åŸ®åŠãªæ§æãšã©ãŒãåŒãèµ·ããã
æ°ãã«node_t *åãå®çŸ©ããããšã§ãã®ãããªèšè¿°ãã¹ãåé¿ã§ããã以äžã®ã³ãŒãããã®äŸã§ããã
typedef node_t *node_ptr_t;
node_ptr_t startptr, endptr, curptr, prevptr, errptr, refptr;
ããã«ãããerrptrãå«ããŠå
šãŠã®å€æ°ãnode_t *åã§ããããšãä¿èšŒãããã
å代å
¥ãæžãæããäžå¯èœãªæåå宿°ã®é
åïŒããŒãã«ïŒãå®çŸ©ãããšãããtypedefãå©çšããããšã§åããããããªãã
#if 0
static const char *const planetNamesTable[] = { "Mercury", "Venus", "Earth", "Mars" };
#else
/* 以äžã¯äžèšãšç䟡ã */
typedef const char *ConstCharPtr;
static const ConstCharPtr planetNamesTable[] = { "Mercury", "Venus", "Earth", "Mars" };
#endif
颿°ãžã®ãã€ã³ã¿ãå©çšããå Žåã typedef ãå©çšããããšã§å¯èªæ§ãåäžã§ããå¯èœæ§ãããã
#include <stdio.h>
/* 颿°åã®ãšã€ãªã¢ã¹ */
typedef int binary_operator_t(int, int);
static int add(int a, int b) { return a + b; }
int main(int argc, char *argv[]) {
#if 0
int(*f)(int, int) = add;
#else
/* 以äžã¯äžèšãšå矩ã ããããç°¡æœãã€æçã§ããã */
binary_operator_t *f = add;
#endif
printf("add(12, 13) = %d\n", f(12, 13));
}
ãªããäžèšã¯ä»¥äžã®ããã«ãæžããã
#include <stdio.h>
/* 颿°ãã€ã³ã¿åã®ãšã€ãªã¢ã¹ */
typedef int (*binary_operator_ptr_t)(int, int);
static int add(int a, int b) { return a + b; }
int main(int argc, char *argv[]) {
binary_operator_ptr_t f = add;
printf("add(12, 13) = %d\n", f(12, 13));
}
颿°åãããã¯é¢æ°ãã€ã³ã¿åã®ãšã€ãªã¢ã¹ãå®çŸ©ããŠãããšãç¹ã«ã³ãŒã«ããã¯é¢æ°ãžã®ãã€ã³ã¿ãåŒæ°ãšããŠåãåã颿°ãå®çŸ©ãããšãã«èšè¿°æ§ãå¯èªæ§ãåäžããã
é
åã«å¯Ÿã㊠typedef ãå©çšããããšãã§ããã
#include <stdio.h>
typedef int array_int_2_t[2];
int main(int argc, char *argv[]) {
array_int_2_t a;
a[0] = 12;
a[1] = 13;
printf("a[0] = %d, a[1] = %d\n", a[0], a[1]);
}
ãªãã以äžã®ãããªã³ãŒãã«å¯Ÿããåäœã¯æªå®çŸ©ãšãªããã°ããŒãã«ã¹ã³ãŒããæã¡ãã¢ã³ããŒã¹ã³ã¢_ã§å§ãŸãèå¥åããããã¯_ã§å§ãŸãããã®æ¬¡ã倧æåã®èå¥å[泚é 2][1][2]ã¯äºçŽæžã¿èå¥åã§ãããããã宣èšãŸãã¯å®çŸ©ããå Žåã¯åäœæªå®çŸ©ãšãããŠããããã§ãã[3][4]ã
typedef struct _MyStruct {
...
} MyStruct;
ãã¯ããšã®æ¯èŒ
[ç·šé]C/C++ã«ã¯ããã¹ãã®çœ®ææ©èœãšããŠãã¯ããåãã£ãŠããããååã®çœ®æã«äœ¿ãã«ã¯åé¡ãããããŸãããã€ã³ã¿åãæ£ããæ±ããªãã
#define const_char_ptr_t const char *
const_char_ptr_t s1 = "abc", s2 = "ABC"; // s2ã¯const charåãšãªããã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ããã
typedefã§ããã°ãã€ã³ã¿åãæ£ããæ±ããã
typedef const char *const_char_ptr_t;
const_char_ptr_t s1 = "abc", s2 = "ABC";
ãŸãããã¯ãã¯ä¹±æŽãªçœ®æãè¡ãªãããšãããæå³ããªã眮æã«ããåå ç¹å®ã®ãã«ããã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ããããšãããã
C++
[ç·šé]Cèšèªãšç°ãªããC++ã«ãããŠæ§é äœãå
±çšäœãåæåãã¯ã©ã¹åã®å€æ°ã宣èšããéã¯ãstructãunionãenumãclassããŒã¯ãŒãã®äœ¿çšã¯ãªãã·ã§ã³ãšãªã£ãŠããããããŸããããªããããçç¥ã§ãããäŸãã°ã
struct my_struct {
int data1;
int data2;
char data3;
};
ãšããå®çŸ©ããããã°ãtypedefãšã€ãªã¢ã¹ãæç€ºçã«å®çŸ©ããããstructããŒã¯ãŒããæç€ºçã«äœ¿çšããããããšãã
my_struct a;
ãšå®£èšã§ããã
C++ã§ã¯ã¯ã©ã¹ïŒãããã¯æ§é äœïŒå
éšã§typedefã䜿çšããããšã§ãã¯ã©ã¹ ã¹ã³ãŒãã®ã·ããã ãå®çŸ©ããããšãã§ããããããã³ãã¬ãŒãã䜿çšãããžã§ããªãã¯ããã°ã©ãã³ã°ãããã¯ã¿ã€ãã³ã°ã«éœåããããC++æšæºã©ã€ãã©ãªã®STLã®å®è£
ã§ã¯ããã®ãã¯ããã¯ãå©çšãããŠããã
C++ã®usingãšã€ãªã¢ã¹å®£èš
[ç·šé]C++ã§ã¯typedefãCèšèªåæ§ã«ãšã€ãªã¢ã¹å®£èšã®ããã«å©çšã§ããããC++11ã§ã¯usingããŒã¯ãŒãã«ããææ³ã远å ãããã
typedef int MyInt; // intã®å¥åMyIntã®å®£èš
C++11ã§ã¯ãäžèšã¯ä»¥äžã®ããã«ãæžããã
using MyInt = int; // intã®å¥åMyIntã®å®£èš
ãªããtypedefã¯ãã³ãã¬ãŒãåã§ããªãããC++11ã§ã¯usingã«ãããšã€ãªã¢ã¹ãã³ãã¬ãŒãã远å ãããã
template <typename T> using TStringMap = std::map<std::string, T>;
TStringMap<double> diametersTable = { { "Mercury", 4879 }, { "Venus", 12104 }, { "Earth", 12756 }, { "Mars", 6792 } };
æ¹å€ãšå©ç¹
[ç·šé]äžéšã®äººã
ã¯ãtypedefãåºç¯ã«äœ¿çšããããšã«å察ããŠãããã»ãšãã©ã®è°è«ã¯ãtypedefã¯åã«å€æ°ã®å®éã®ããŒã¿åãé ãã ãã§ãããšããèãã«éäžãããäŸãã°ãLinuxã«ãŒãã«ããã«ãŒã§ãããããã¥ã¡ã³ãäœæãè¡ã£ãŠããã°ã¬ãã°ã»ã¯ããŒïŒããŒããã³ïŒGreg Kroah-HartmanïŒã¯ã颿°ãããã¿ã€ã宣èšãé€ããŠãtypedefã®äœ¿çšããããããããšããŠããã圌ã¯ãtypedefã䜿çšããããšããå¿
èŠä»¥äžã«ã³ãŒããæ··ä¹±ãããã ãã§ãªããããã°ã©ããå·šå€§ãªæ§é äœãåçŽãªåãšèª€èªèããŠäœ¿çšããŠããŸãããšããããšäž»åŒµããŠãã[5]ã
ããããtypedefãæšå¥šããŠãåºç¯ã«äœ¿çšããããšã«å€§è³æãã人ã
ããããç¹ã«ãCèšèªãçºæãããã©ã€ã¢ã³ã»ã«ãŒããã³ (Brian W. Kernighan) ãšããã¹ã»ãªãã㌠(Dennis M. Ritchie) ã¯ããã°ã©ãã³ã°èšèªCïŒè±ïŒThe C Programming LanguageïŒãšããCèšèªã®å®çŸ©æžã«ãtypedefã®å©çšã«å¯Ÿããã¡ãªããã2ã€è¿°ã¹ãŠããããŸã第äžã¯ããœãããŠã§ã¢ããã«ããã©ãããã©ãŒã å±éããéã«ããœãŒã¹ã³ãŒãã®ç§»æ€æ§ïŒããŒã¿ããªãã£ïŒãåäžãããææ®µãšããŠéèŠãªããšã§ãããããŒã¿åã®æ¹è¯ãããã¯å€æŽãå¿
èŠã«ãªããšãã«ãå¿
èŠãªå€æŽã¯ãã 1ã€ã ãã®typedefã®å®£èšç®æã§ãããtypedefã·ããã ãå©çšããŠããããã°å€ãã®ç®æã倿Žããå¿
èŠããªããªã[泚é 3]ã第äºã«ãããŒã¿ãé ãããšã«å ããŠãããŒã¿ã®ã«ãã»ã«åãåäžãããããã«ãªããè€éãªå®£èšãããçè§£ãããããªãããšã§ããã
ããšããšCèšèªã®èŠæ Œã§ã¯ãåºæ¬åïŒintãªã©ã®çµã¿èŸŒã¿åïŒã®ãµã€ãºãå
éšè¡šçŸãå³å¯ã«èŠå®ããŠããããåŠçç³»äŸåãšãªã£ãŠããïŒã¿ãŒã²ãã ãã©ãããã©ãŒã ã«ãšã£ãŠéœåã®è¯ããµã€ãºãå
éšè¡šçŸã«èšå®ããŠããããšã«ãªã£ãŠããïŒããããã©ãããã©ãŒã éã®éããåžåããŠåããœãŒã¹ã³ãŒãã䜿ãããã«ã¯typedefã¯å¿
é ã®æè¡ãšããããC99/C++11èŠæ Œã§ã¯ãint32_tãªã©ã®ãµã€ãºãå
éšè¡šçŸãä¿èšŒããæŽæ°åã<stdint.h>/<cstdint>ã«ãŠæšæºåããããããããã¯éäŸtypedefã·ããã ãå©çšããŠå®è£
ãããããšã¯ããããšã€ãªã¢ã¹ã«ããåå®çŸ©ã¯äžèœã§ã¯ãªããæ±æŽæ°æ¡åŒµãªã©ã®ããã«çµã¿èŸŒã¿åã«ãŸã€ããåé¡ã¯äŸç¶ãšããŠæ®ã£ãŠãã[6]ã
Microsoft Windowsã«ãããWindows APIã®äŸã§ãããšãWin16ãšWin32ã«ãããintåã®éããåžåã§ããINT32åããšã€ãªã¢ã¹å®çŸ©ãããŠããããŸããWin16ãWin32ãWin64ã«ããããã€ã³ã¿äºææŽæ°åã®éããåžåã§ããINT_PTRåããšã€ãªã¢ã¹å®çŸ©ãããŠãã[7]ã
ä»ã®èšèª
[ç·šé]HaskellãMirandaãObjective Camlçã®ãããªãå€ãã®éçåä»ãã®é¢æ°åèšèªã§ã¯ãCèšèªã§ã®typedefãšåãåãããããtype synonymãå®çŸ©ããããšãã§ãããHaskellã§ã®äŸã瀺ãã
type PairOfInts = (Int, Int)
ããã«ãããIntã®ãã¢ãšåããã®ãtype synonymã®PairOfIntsã§å®çŸ©ããããšãã§ããã
Pascalããã³Object Pascalã§ã¯typeããŒã¯ãŒãã䜿çšããããšã§ãtypedefåæ§ã«å¥åãå®çŸ©ããããšãã§ããã
type
TMyInt = Integer; // çµã¿èŸŒã¿åIntegerã«å¯Ÿããã·ããã ã
C/C++ã®ç¹åŸŽãåãå
¥ããC#èšèªã§ã¯ãåºæ¬åã®ãµã€ãºã¯å³å¯ã«æ±ºããããŠããããŸãtypedefã¯èšèªæ©èœãšããŠååšããªããã代ããã«usingãšã€ãªã¢ã¹ ãã£ã¬ã¯ãã£ãæ©èœãååšãã[8]ã
using MyString = System.String;
ãžã§ããªã¯ã¹ãå©çšãããšãã¯ç¹ã«ååãé·å€§ã«ãªããã¡ã§ããããœãŒã¹ãã¡ã€ã«äžã§äœåºŠãåºçŸããå Žåã«ãšã€ãªã¢ã¹ãå®çŸ©ããŠãããšèšè¿°ã楜ã«ãªããæ€çŽ¢ã眮æã容æã«ãªãã
using MyStringToDoubleDictionary = System.Collections.Generic.Dictionary<string, double>;
ãã®usingãšã€ãªã¢ã¹ã¯ããã£ã¬ã¯ãã£ããèšè¿°ããããœãŒã¹ãã¡ã€ã«å
ã§ã®ã¿å¹æãããããC# 10ã§ã¯global修食åãä»ããããšã§ããœãŒã¹ãã¡ã€ã«ãè¶
ããŠã°ããŒãã«ãªãšã€ãªã¢ã¹ãå®çŸ©ã§ããããã«ãªã£ã[9]ã
èæ³š
[ç·šé]泚é
[ç·šé]- â C++ããã³C99以éã®Cèšèªã§ã¯ãè«çåãç¬èªã«å®çŸ©ãã代ããã«èšèªæšæºã®
boolåã_Boolåã䜿ãã»ããããããã©ã€ãã©ãªã«ãã£ãŠã¯äºææ§ãããã¯çžäºéçšæ§ã®ããã«ãããŠintãunsigned charãªã©ã®ãšã€ãªã¢ã¹ã䜿ãããšãããã - â äºçŽåã®ã«ãŒã«ã¯C/C++ã§åŸ®åŠã«ç°ãªããCã§ã¯
__ã§å§ãŸãèå¥åãäºçŽããããC++ã§ã¯__ãå«ãèå¥åãäºçŽãããã - â ãã¡ãããprintf/scanfæžåŒãªã©ãåã«äŸåããéšåã¯åãšã€ãªã¢ã¹å€æŽåŸã«é©åã«ä¿®æ£ãããããããã¯ïŒå¯å€é·åŒæ°ã«æž¡ãåã«æžåŒã«å¯Ÿå¿ããæç€ºçãªå倿ãèšè¿°ãããªã©ããŠïŒåãšã€ãªã¢ã¹å€æŽã®åœ±é¿ãåããªããããªåœ¢ã§æ£ããå©çšãããããšããåæã§ããã
åºå ž
[ç·šé]- â Deep C++, äºçŽå - MSDN, Internet Archive
- â Identifiers (C++) | Microsoft Docs
- â âDCL37-C. äºçŽæžã¿ã®èå¥åã宣èšãŸãã¯å®çŸ©ããªãâ. JPCERTã³ãŒãã£ããŒã·ã§ã³ã»ã³ã¿ãŒ (2015幎1æ22æ¥). 2015幎1æ25æ¥é²èЧã
- â [è¿·ä¿¡] æ§é äœã®ã¿ã°åã¯äžç·ã§å§ãã | æ ªåŒäŒç€Ÿãããã
- â Kroah-Hartman, Greg (2002幎7æ1æ¥). âProper Linux Kernel Coding Styleâ. Linux Journal. 2007幎9æ23æ¥é²èЧã âUsing a typedef only hides the real type of a variable.â
- â 第5åãint åã®ãµã€ãº | æ ªåŒäŒç€Ÿãããã, Internet Archive
- â Windows Data Types (BaseTsd.h) - Win32 apps | Microsoft Docs
- â using ãã£ã¬ã¯ãã£ã - C# ãªãã¡ã¬ã³ã¹ | Microsoft Docs
- â §global 修食å : using ãã£ã¬ã¯ãã£ã - C# ãªãã¡ã¬ã³ã¹ - C# | Microsoft Learn
é¢é£é ç®
[ç·šé]å€éšãªã³ã¯
[ç·šé]- http://www.cprogramming.com/tutorial/typedef.html - detailed discussion of typedef at CProgramming.com