C言語なら俺に聞け 163 (350レス)
1-

1
(1): (ワッチョイ 7bba-Lem2) 07/16(火)22:43 ID:ZrsCjURC0(1) AAS
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
外部リンク:paiza.io
外部リンク:ideone.com
外部リンク:codepad.org

C17
外部リンク[pdf]:www.open-std.org
省14
331
(1): (アウアウエー Sada-GGiU) 11/08(金)12:18 ID:F9yTI1pla(1/4) AAS
LPTSTR lptStr = L"テスト";
332: (アウアウエー Sada-GGiU) 11/08(金)12:20 ID:F9yTI1pla(2/4) AAS
あと
#define UNICODE
#define _UNICODE
だったかな
333: (アウアウエー Sada-GGiU) 11/08(金)12:28 ID:F9yTI1pla(3/4) AAS
それでもだめなら
文字コードが違うんじゃないですかね
334: (ワッチョイ 7161-m4Ma) 11/08(金)12:59 ID:+8UCAN2P0(4/7) AAS
>>330
どストレートな罵倒は久しぶりに聞いたよ
高校上がってからは聞かなくなったけどね
335: (ワッチョイ 7161-m4Ma) 11/08(金)13:00 ID:+8UCAN2P0(5/7) AAS
>>331
ありがとう、だけどダメそうだ
文字コード関連のエラーなんだろうけどどうしたものか
336
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f532-Q1tn) 11/08(金)13:02 ID:Me1tPYCI0(1/2) AAS
char と wchar_t の不整合じゃなくて const の有無の問題じゃないの?

C++ で文字列リテラルまわりの扱いで仕様変更があったからそれに関係してるのかも?
C++ での文字列リテラルの型は const char[] (ワイド文字リテラルの場合は const wchar_t[]) だが、文字列リテラルから直接変換する場合に限り char* (ワイド文字リテラルの場合は wchar_t*) に暗黙に変換して構わないというルールが C++03 まではあって、このルールは C++11 で削除されたという経緯がある。
つまり C++11 以降は文字列リテラルから暗黙には const を剥がすことが出来ない。 (キャストを書けば出来るけど。)

C では文字列リテラルの型は元から char[] で、 const が付いてない。
だから const まわりの制限とは関係ないんだが、これは C の仕様のほうがおかしいし、 C++ と同様の判定をしたほうが理に適っているとマイクロソフトが考えることはあるかもしれない。
337
(1): (アウアウエー Sada-GGiU) 11/08(金)13:18 ID:F9yTI1pla(4/4) AAS
E0144 エンティティの初期化
型”cont wchar_t *"の値を使用して"wchar_t *"のエンティティを初期化することはできません

C2044は関係無い
338
(1): (ワッチョイ 7161-m4Ma) 11/08(金)14:51 ID:+8UCAN2P0(6/7) AAS
>>336
なるほどね、LPTSTRがchar*だから代入できないって話になるのか
それがわかったらエラー文にかいてあることが理解出来るね

昔の仕様だとconst charに見えて実際は違かったってこと?
それなら今回のコードもエラー吐かないし悩まなくてよかったのに
339: (ワッチョイ 7161-m4Ma) 11/08(金)14:52 ID:+8UCAN2P0(7/7) AAS
>>337
関係ないの?LPSTRに代入できませんって言ってるように見えるけど
340: (ササクッテロラ Sp79-P7MY) 11/08(金)16:25 ID:1lsgaMlnp(1) AAS
signedとunsignedでも怒り狂うからなぁw
いいんだよ、こっちは中身しってんだから余計なエラー吐くなよ
341
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f532-Q1tn) 11/08(金)17:24 ID:Me1tPYCI0(2/2) AAS
>>338
> 昔の仕様だとconst charに見えて実際は違かったってこと?

C の規格としては本来的に文字列リテラルの型には const は付かない。
これは今も昔も同じ。 変更はない。

なので何かが変わったとしたらマイクロソフトの独自仕様。
私はそのへんに詳しいわけじゃないけど C++ の規格改定に引きずられた可能性は想像できるなぁというぼんやりした予想なので経緯はわからぬ。

でもまあ結果的に const の問題ってのは妥当なみたいだね。
342
(1): (ワッチョイ 3679-NO1F) 11/09(土)14:04 ID:L+GgUCLJ0(1) AAS
LPTSTR lptStr = (LPTSTR)TEXT("テスト"); で警告出たりするのかな?
糞面倒だけどキャストで通るならそれ以上の対応不用
343
(2): (ワッチョイ f648-UxC2) 11/09(土)14:22 ID:12zpUv7J0(1) AAS
VS使ってるからたぶんCじゃなくてC++
こういうボンクラの自覚ないボンクラは相手しても疲れるだけ
344
(1): (ワッチョイ 7161-m4Ma) 11/09(土)18:12 ID:IeEwNzSH0(1/3) AAS
>>341
理解した
constは付かないはずなのにリテラルにVisual Studioが勝手に付いてることにしてくるってことね
わざわざありがとうスッキリしたよ
345: (ワッチョイ 7161-m4Ma) 11/09(土)18:13 ID:IeEwNzSH0(2/3) AAS
>>342
いけた
たしかに面倒だけど仕方ないね
346: (ワッチョイ 7161-m4Ma) 11/09(土)18:17 ID:IeEwNzSH0(3/3) AAS
>>343
そんなこと言いながら何回もレスくれるなんて
347: (ワッチョイ 0920-pds3) 11/09(土)18:29 ID:mxjkBfxb0(1) AAS
>>315
どっちもいける

実行時エラー
外部リンク:wandbox.org
> Segmentation fault

コンパイル時エラー
外部リンク:wandbox.org
> prog.c: In function 'main':
> prog.c:8:17: error: '%d' directive writing 11 bytes into a region of size 1 [-Werror=format-overflow=]
> 8 | sprintf(s, "%d", INT_MIN);
省5
348: (ワッチョイ cdd5-MfT4) 11/10(日)00:27 ID:dkv1a77w0(1) AAS
左辺をLPCTSTRにすれば良くない?
リテラルの文字列を可変にすること自体が本来は不要だし、右辺を可変にキャストするよりは左辺を不変として (LPCTSTRとして) 受け取れば良いと思う
349: はちみつ餃子◆8X2XSCHEME (ワッチョイ cd32-4Bi2) 11/10(日)09:35 ID:a6nPaG4v0(1) AAS
>>344
オンラインコンパイラで VS17.10 を確かめてみたが文字列リテラルには const は付かないぞ。
お前が間違って C++ を使ってるという >>343 の意見に一票。
350: (ワッチョイ e520-2uFP) 11/10(日)15:28 ID:E/UouhcZ0(1) AAS
>>322
・Microsoft Visual Studio Community 2022 (64 ビット) を使用し「C++コンソールアプリ」で新規プロジェクト作成
・ソリューションエクスプローラーでソースファイルにあるファイル名を*.cppから*.cへ変更
・ファイル名を変更したファイルに下記をコピペ
#include <windows.h>

int main(void)
{
LPTSTR lptStr = TEXT("テスト");
}
・ビルド(B)→ソリューションのビルド(R) でフツーにビルド通ったわ。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.940s*