teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

記述内容の整理

2021/01/27 20:58

投稿

actorbug
actorbug

スコア2515

answer CHANGED
@@ -1,10 +1,51 @@
1
+ 引数がconst char*型やLPCSTRなどの関数に渡しても正常に動作するのは、
2
+ `const char*`や`LPCSTR`へのキャスト演算子が定義されているからですね。
3
+ [CSimpleStringT:: operator PCXSTR](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/reference/csimplestringt-class?view=msvc-160#operator_pcxstr)
4
+
5
+ ※`CString`の実体が`CStringT`で、`CStringT`は`CSimpleStringT`を継承している
6
+
7
+ printfに直接CStringを渡した場合については、正式には動作すると保証されているわけではありません。
8
+ 最新のVisual Studio 2019 Communityでビルドすると警告が出ますし、
9
+ 上記のリンク先でも、printfに渡す際には事前にキャストするように書かれています。
10
+
1
- ごめんなさい。printfにCStringを渡したときに動作する理由については、こちらを参照してください。
11
+ それでも動作する理由については、こちらを参照してください。
2
12
  [How can CString be passed to format string %s?](https://stackoverflow.com/questions/6608942/how-can-cstring-be-passed-to-format-string-s)
3
13
 
4
- ---
14
+ 上記リンク先によると、CStringと同じレイアウト(char*型のメンバ変数1つのみ)であれば、
5
- 以前の内容
15
+ printfに直接渡して動作するようです。
16
+ ただ、いつまでこの動作が保証されるかは未知数ですので、この動作に依存するのはお勧めできません。
6
17
 
18
+ ```c++
19
+ #include <stdio.h>
20
+ #include <string.h>
7
- `const char*`や`LPCSTR`へのキャスト演算子が定義されているからですね。
21
+ #include <atlstr.h> // CString用
8
- [CSimpleStringT:: operator PCXSTR](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/reference/csimplestringt-class?view=msvc-160#operator_pcxstr)
9
22
 
23
+ class CTestStr
24
+ {
25
+ public:
26
+ CTestStr(const char* _str)
27
+ {
28
+ str = new char[256];
29
+ strcpy_s(str, 256, _str);
30
+ }
31
+ ~CTestStr(void) { delete[] str; };
32
+ operator LPCSTR() { return str; }
33
+
34
+ private:
35
+ char* str;
36
+
37
+ };
38
+
39
+ int main(void)
40
+ {
41
+ CString str1 = "テスト1";
42
+ CTestStr str2("テスト2");
43
+
44
+ fputs(str1, stdout);
10
- ※`CString`の実体が`CStringT`で、`CStringT`は`CSimpleStringT`を継承してい
45
+ printf("%s\n", str1); // テスト1 表示され
46
+ fputs(str2, stdout);
47
+ printf("%s\n", str2); // 上と同じように表示出来る???
48
+
49
+ return 0;
50
+ }
51
+ ```

3

リンク追加

2021/01/27 20:58

投稿

actorbug
actorbug

スコア2515

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

2

間違いに気づいて修正

2021/01/27 10:53

投稿

actorbug
actorbug

スコア2515

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

1

CSimpleStringTの説明追加

2021/01/27 10:48

投稿

actorbug
actorbug

スコア2515

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