-
Notifications
You must be signed in to change notification settings - Fork 1
/
cFriendsCommon.h
103 lines (86 loc) · 3.08 KB
/
cFriendsCommon.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef CPPFRIENDS_CFRIENDSCOMMON_H
#define CPPFRIENDS_CFRIENDSCOMMON_H
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// CとC++のどちらでコンパイルするかでサイズが変わる
static const char g_arrayForTestingSize[sizeof('a')] = {'A'};
typedef struct tagTestingOuterStruct1 {
struct tagTestingInnerStruct {
int member1;
} anInstance;
int member;
} TestingOuterStruct1;
typedef struct tagTestingOuterStruct2 {
// C++では、OuterStruct1の内部クラスとは区別される
// Cではstruct tagInnerStructを再定義したことになり、エラーになる
#if 0
struct tagTestingInnerStruct {
int member2;
} anInstance;
#endif
int member;
} TestingOuterStruct2;
// 空の構造体のサイズが、gccとg++で異なる
// そもそもCで空の構造体は作れない(未定義動作)
typedef struct tagTestingEmptyStruct {} TestingEmptyStruct;
typedef int SpeedKph; // 時速キロ
// 速度の段階
typedef enum tagSpeedIndex {
SPEED_STOP,
SPEED_LOW,
SPEED_MIDDLE,
SPEED_HIGH, // もっと速い場合は読み替える
SPEED_COUNT, // 要素数
} SpeedIndex;
// 普通の速度指示
typedef struct tagSpeedParameter {
size_t size; // この構造体、またはこの構造体を含む構造体のbyteサイズ
SpeedIndex index;
} SpeedParameter;
// 特に速い速度指示
typedef struct tagExtSpeedParameter {
SpeedParameter base; // 必ず先頭メンバに置く
SpeedKph maxSpeed;
} ExtSpeedParameter;
// README.mdはこの値で測る。メモリが足りなければ随時減らしてください。
// static const size_t LongStringLength = (sizeof(size_t) > 4) ? 0xefffffff : 0xfffffff;
// メモリの少ないPCでも失敗しない控えめなサイズだが、数百Mbyteないと有意な差が出ない
static const size_t LongStringLength = 0xffff;
static inline char* CreateLongString(void) {
const size_t LongStringBufferLength = LongStringLength + 1;
char* pStr = (char*)(malloc(sizeof(char) * LongStringBufferLength));
assert(pStr);
memset(pStr, 'a', LongStringLength);
pStr[LongStringLength] = '\0';
return pStr;
}
static inline int IsLongStringEmpty(void) {
char* pStr = CreateLongString();
int result = (strlen(pStr) == 0);
free(pStr);
pStr = NULL;
return result;
}
static inline size_t GetLongStringLength(void) {
char* pStr = CreateLongString();
size_t length = strlen(pStr);
free(pStr);
pStr = NULL;
return length;
}
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // CPPFRIENDS_CFRIENDSCOMMON_H
/*
Local Variables:
mode: c
coding: utf-8-dos
tab-width: nil
c-file-style: "stroustrup"
End:
*/