回答編集履歴

4

記述内容の整理

2021/01/27 20:58

投稿

actorbug
actorbug

スコア2429

test CHANGED
@@ -1,14 +1,4 @@
1
- ごめんなさい。printfにCStringを渡したときに動作する理由については、こちらを参照してください。
1
+ 引数がconst char*型やLPCSTRなどの関数に渡しても正常に動作するは、
2
-
3
- [How can CString be passed to format string %s?](https://stackoverflow.com/questions/6608942/how-can-cstring-be-passed-to-format-string-s)
4
-
5
-
6
-
7
- ---
8
-
9
- 以前の内容
10
-
11
-
12
2
 
13
3
  `const char*`や`LPCSTR`へのキャスト演算子が定義されているからですね。
14
4
 
@@ -17,3 +7,95 @@
17
7
 
18
8
 
19
9
  ※`CString`の実体が`CStringT`で、`CStringT`は`CSimpleStringT`を継承している
10
+
11
+
12
+
13
+ printfに直接CStringを渡した場合については、正式には動作すると保証されているわけではありません。
14
+
15
+ 最新のVisual Studio 2019 Communityでビルドすると警告が出ますし、
16
+
17
+ 上記のリンク先でも、printfに渡す際には事前にキャストするように書かれています。
18
+
19
+
20
+
21
+ それでも動作する理由については、こちらを参照してください。
22
+
23
+ [How can CString be passed to format string %s?](https://stackoverflow.com/questions/6608942/how-can-cstring-be-passed-to-format-string-s)
24
+
25
+
26
+
27
+ 上記リンク先によると、CStringと同じレイアウト(char*型のメンバ変数1つのみ)であれば、
28
+
29
+ printfに直接渡して動作するようです。
30
+
31
+ ただ、いつまでこの動作が保証されるかは未知数ですので、この動作に依存するのはお勧めできません。
32
+
33
+
34
+
35
+ ```c++
36
+
37
+ #include <stdio.h>
38
+
39
+ #include <string.h>
40
+
41
+ #include <atlstr.h> // CString用
42
+
43
+
44
+
45
+ class CTestStr
46
+
47
+ {
48
+
49
+ public:
50
+
51
+ CTestStr(const char* _str)
52
+
53
+ {
54
+
55
+ str = new char[256];
56
+
57
+ strcpy_s(str, 256, _str);
58
+
59
+ }
60
+
61
+ ~CTestStr(void) { delete[] str; };
62
+
63
+ operator LPCSTR() { return str; }
64
+
65
+
66
+
67
+ private:
68
+
69
+ char* str;
70
+
71
+
72
+
73
+ };
74
+
75
+
76
+
77
+ int main(void)
78
+
79
+ {
80
+
81
+ CString str1 = "テスト1";
82
+
83
+ CTestStr str2("テスト2");
84
+
85
+
86
+
87
+ fputs(str1, stdout);
88
+
89
+ printf("%s\n", str1); // テスト1 表示される
90
+
91
+ fputs(str2, stdout);
92
+
93
+ printf("%s\n", str2); // 上と同じように表示出来る???
94
+
95
+
96
+
97
+ return 0;
98
+
99
+ }
100
+
101
+ ```

3

リンク追加

2021/01/27 20:58

投稿

actorbug
actorbug

スコア2429

test CHANGED
@@ -1,4 +1,6 @@
1
- ごめんなさい。printfにCStringを渡したときに動作する理由は、これではありませんで
1
+ ごめんなさい。printfにCStringを渡したときに動作する理由については、こちらを参照てください
2
+
3
+ [How can CString be passed to format string %s?](https://stackoverflow.com/questions/6608942/how-can-cstring-be-passed-to-format-string-s)
2
4
 
3
5
 
4
6
 

2

間違いに気づいて修正

2021/01/27 10:53

投稿

actorbug
actorbug

スコア2429

test CHANGED
@@ -1,3 +1,13 @@
1
+ ごめんなさい。printfにCStringを渡したときに動作する理由は、これではありませんでした。
2
+
3
+
4
+
5
+ ---
6
+
7
+ 以前の内容
8
+
9
+
10
+
1
11
  `const char*`や`LPCSTR`へのキャスト演算子が定義されているからですね。
2
12
 
3
13
  [CSimpleStringT:: operator PCXSTR](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/reference/csimplestringt-class?view=msvc-160#operator_pcxstr)

1

CSimpleStringTの説明追加

2021/01/27 10:48

投稿

actorbug
actorbug

スコア2429

test CHANGED
@@ -1,3 +1,7 @@
1
1
  `const char*`や`LPCSTR`へのキャスト演算子が定義されているからですね。
2
2
 
3
3
  [CSimpleStringT:: operator PCXSTR](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/reference/csimplestringt-class?view=msvc-160#operator_pcxstr)
4
+
5
+
6
+
7
+ ※`CString`の実体が`CStringT`で、`CStringT`は`CSimpleStringT`を継承している