C
#include <stdio.h>

typedef struct _sample1 {
	char str1[7];
	char str2[13];
	double num1;
} sample1;

typedef struct _sample2 {
	char str1[11];
	char str2[3];
	int	 num1;
} sample2;

void output(void* data[]) {
	sample1* data1 = (sample1*)data[0]; // sample1 のポインタを取得
	sample2* data2 = (sample2*)data[1]; // sample2 のポインタを取得

	printf("sample1->str1: %s\n", data1->str1);
	printf("sample1->str2: %s\n", data1->str2);
	printf("sample1->num1: %f\n", data1->num1);

	printf("sample2->str1: %s\n", data2->str1);
	printf("sample2->str2: %s\n", data2->str2);
	printf("sample2->num1: %d\n", data2->num1);
}

int main() {
	sample1 data1 = {"123456", "123456789012", 12.345};
	sample2 data2 = {"1234567890", "12", 123};
	
	// void*は、任意のポインターを配列で受け取れる
	void* data[2] = {};
	data[0] = (void*)&data1;
	data[1] = (void*)&data2;
	output(data);
}
投稿日時: 2025-01-24 13:49:24

もともとVisual Studioを入れていて、C++が書ける状態の時に、
ちょっとしたCのコード書いて動作させたい場合に、Visual Studioでプロジェクトを作るかというとちょっと手間なので
サクッと書いて、サクッと実行できたらと思うので
cl.exeの格納先のパスを通して使ってみる。

Visual Studio 2022だとこんな感じのパス
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\bin\Hostx64\x64

cl コマンドのヘルプを表示
c:\>cl /?
Microsoft(R) C/C++ Optimizing Compiler Version 19.41.34120 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

                         C/C++ COMPILER OPTIONS


                              -最適化-

/O1 最大限の最適化 (スペースを優先)     /O2 最大限の最適化 (速度を優先)
/Ob<n> インライン展開 (既定値 n=0)      /Od 最適化を無効にする (既定)
/Og グローバルな最適化を有効にする      /Oi[-] 組み込み関数を有効にする
/Os コード スペースを優先する           /Ot コードのスピードを優先する
/Ox 最適化 (速度を優先)
/favor:<blend|AMD64|INTEL64|ATOM> 最適化するプロセッサを、次から 1 つ選択する:
   blend - いくつかの異なる x64 プロセッサ用の最適化の組み合わせ
   AMD64 - 64 ビット AMD プロセッサ
   INTEL64: Intel(R)64 アーキテクチャ プロセッサ
   ATOM - Intel(R) Atom(TM) プロセッサ

                             -コード生成-

/Gu[-] は、個別の関数に個別のアドレスが含まれるようにします
/Gw[-] リンカー用の個別のグローバル変数
/GF 読み取り専用の文字列プールを有効にする
/Gy[-] リンカーの別の機能               /GS[-] セキュリティ チェックを有効にする
/GR[-] C++ RTTI を有効にする
/guard:cf[-] は CFG (Control Flow Guard) を有効にします
/guard:ehcont[-] EH 継続メタデータ (CET) を有効にする
/EHs C++ EH を有効にする (SEH 例外なし) /EHa C++ EH を有効にする (SEH 例外あり)
([return] キーを押すと継続)
/EHc extern "C" は既定の nothrow になる
/EHr 常に noexcept ランタイム終了チェックを生成する
/fp:<contract|except[-]|fast|precise|strict> 浮動小数点モデルの選択:
   contract - コードを生成するときに浮動小数点の短縮形を検討する
   except[-] - コードの生成中に浮動小数点の例外を考慮します
   fast - "fast" 浮動小数点モデルです。結果の予測が困難になります
   precise - "precise" 浮動小数点モデルです。結果は予測可能です
   strict - "strict" 浮動小数点モデルです (/fp:except を暗示)
/fp:except を指定しても /Qfast_transcendentals を指定するとインライン FP 組み込みが生成されます
/Qspectre[-] CVE 2017-5753 に対する軽減策を有効にする
/Qpar[-] 並列コード生成を有効にする
/Qpar-report:1 自動並行化診断。並行化されたループを示します
/Qpar-report:2 自動並行化診断。並行化されていないループを示します
/Qvec-report:1 自動ベクトル化診断。ベクトル化されたループを示します
/Qvec-report:2 自動ベクトル化診断。ベクトル化されていないループを示します
/GL[-] リンク時のコード生成を有効にする
/volatile:<iso|ms> 揮発性モデルを選択します:
   iso - 揮発性アクセスで取得/解除セマンティクスは保証されません
   ms  - 揮発性アクセスで取得/解除セマンティクスは保証されます
/GA Windows アプリケーション用の最適化を行う
/Ge すべての関数にスタック チェックを強制する
/Gs[num] スタック チェックの呼び出しを制御する
/Gh _penter 関数呼び出しを有効にする    /GH _pexit 関数呼び出しを有効にする
/GT ファイバー セーフの TLS アクセスを生成する
/RTC1 高速チェックを有効にする (/RTCsu) /RTCc 小さい型のチェックに変換する
/RTCs スタック フレーム ランタイム チェック
/RTCu 初期化されていないローカル変数のチェック
/clr[:option] 次のオプションが指定される場合、共通言語ランタイム用にコンパイルする:
   pure : ネイティブな実行可能コードではなく、IL のみの出力ファイルを作成する
   safe : IL のみの検証可能な出力ファイルを作成する
   netcore : .NET Core ランタイムを対象とするアセンブリを生成する
   noAssembly : アセンブリを生成しない
   nostdlib : アセンブリを検索するときにシステムの .NET Framework ディレクトリを無視する
   nostdimport : 必要なアセンブリを暗黙的にインポートしない
   initialAppDomain : Visual C++ 2002 の最初の AppDomain 動作を有効にする
   implicitKeepAlive- : turn off implicit emission of System::GC::KeepAlive(this)
/fsanitize=address は Address Sanitizer の CodeGen を有効化します
/homeparams レジスタ内で渡されたパラメーターを強制的にスタックに書き込む
/GZ スタック チェックを有効にする (/RTCs)
/Gv __vectorcall の呼び出し規約
/arch:<SSE2|SSE4.2|AVX|AVX2|AVX512> CPU アーキテクチャの最低要件。以下のいずれか:
  SSE2 - (既定) SSE2 対応の CPU で使用できる命令を使用可能にする
  SSE4.2 - SSE 4.2 対応の CPU で使用できる命令を使用可能にする
  AVX - AVX 対応の CPU で使用できる命令を使用可能にする
  AVX2 - AVX2 対応の CPU で使用できる命令を使用可能にする
  AVX512 - AVX-512 対応の CPU で使用できる命令を使用可能にする
/QIntel-jcc-erratum Intel JCC erratum に対する軽減策を有効にする
/Qspectre-load メモリを読み込むすべての命令に対して、Spectre 軽減策を有効にします
/Qspectre-load-cf メモリを読み込むすべての制御フロー命令に対して、Spectre 軽減策を有効にします
/Qspectre-jmp[-] 無条件ジャンプ命令の Spectre 軽減策を有効にする
/fpcvt:<IA|BC> FP から符号なし整数への変換の互換性
  IA - VCVTTSD2USI 命令と互換性のある結果
  BC - VS2017 以前のコンパイラと互換性のある結果
/jumptablerdata switch case ステートメントのジャンプ テーブルを .rdata セクションに配置する

                              -出力ファイル-

/Fa[file] アセンブリ リスティング ファイルに名前を付けます
/FA[scu] アセンブリ リストを設定する    /Fd[file] .PDB ファイル名を指定する
/Fe<file> .EXE ファイルに名前を付けます
/Fm[file] マップ ファイルに名前を付けます
/Fo<file> オブジェクト ファイルに名前を付けます
/Fp<file> プリコンパイル済みヘッダー ファイル名を指定する
/Fr[file] ソース ブラウザー ファイル名を指定する
/FR[file] .SBR 拡張ファイルを指定する
/Fi[file] 前処理されたファイルに名前を付けます
/Fd: <file> .PDB ファイル名を指定する   /Fe: <file> 実行可能ファイル名を指定する
/Fm: <file> マップ ファイル名を指定する
/Fo: <file> オブジェクト ファイル名を指定する
/Fp: <file> .PCH ファイル名を指定する   /FR: <file> .SBR 拡張ファイルを指定する
/Fi: <file> 前処理されたファイル名を指定する
/Ft<dir> #import 用に生成されたヘッダー ファイルの場所
/doc[file] XML ドキュメント コメントを処理し、.xdc ファイルの名前を指定する

                              -プリプロセッサ-

/AI<dir> アセンブリ検索パスに追加する
/FU<file> .NET アセンブリ/モジュールのインポートする
/FU:asFriend<file> .NET アセンブリ/モジュールをフレンドとしてインポートする
/C コメントを削除しません               /D<name>{=|#}<text> マクロを定義する
/E stdout に前処理します                /EP stdout に前処理する、#line なし
/P ファイルを前処理する                 /Fx 挿入コードをファイルにマージする
/FI<file> 必ず使用されるインクルード ファイルに名前を付けます
/U<name> 定義済みのマクロを削除する     /u 定義済みのマクロをすべて削除する
/I<dir> インクルード検索パスに追加する  /X "standard places" を無視する
/PH 前処理時に #pragma file_hash を生成します
/PD すべてのマクロ定義を出力する

                                -言語-

/std:<c++14|c++17|c++20|c++latest> C++ 標準バージョン
    c++14 – ISO/IEC 14882:2014 (既定)
    c++17 – ISO/IEC 14882:2017
    c++20 - ISO/IEC 14882:2020
    c++latest – 標準の最終草案 (機能セットは変更される可能性があります)
/std:<c11|c17|clatest> C 標準バージョン
   c11 - ISO/IEC 9899:2011
   c17 - ISO/IEC 9899:2018
   clatest - 最新のドラフト標準 (機能セットは変更される可能性があります)
/permissive[-] 一部の不適合なコードをコンパイルできるようにします
              (機能セットは変更される可能性があります) (C++20 以降では既定でオフ)
/Za 拡張機能を無効にする (C++ では推奨されません)
/ZW WinRT 言語拡張を有効にします        /Zs 構文チェックのみ
/await 再開可能な関数の拡張機能を有効にする
/await:strict enable: 標準 C++ 20 コルーチンサポートを以前の言語バージョンで有効にする
/constexpr:depth<N>     constexpr 評価の再帰の深さ限度 (既定: 512)
/constexpr:backtrace<N> 診断での N constexpr 評価を示します (既定: 10)
/constexpr:steps<N>     N ステップ後に constexpr 評価を終了します (既定: 1048576)
/Zi デバッグ情報を有効にします          /Z7 前の形式のデバッグ情報を有効にします
/Zo[-] 最適化されたコードのより詳細なデバッグ情報を生成します (既定ではオン)
/ZH: [MD5 |SHA1 |SHA_256] デバッグ情報でファイルのチェックサムを計算するためのハッシュ アルゴリズム (既定値: SHA_256)
/Zp[n] 構造体を n バイト境界でパックします
/Zl .OBJ で既定のライブラリ名を省略します
/vd{0|1|2} vtordisp を無効/有効にします /vm<x> メンバーへのポインターの種類
/Zc:arg1[,arg2] 言語準拠です。引数は次のようになります:
 forScope[-]           スコープ ルールに標準 C++ を適用します
 wchar_t[-]            wchar_t はネイティブ型であって、typedef ではありません
 auto[-]               新しい標準 C++ の解釈を auto に適用します
 trigraphs[-]          トライグラフを有効にします (既定ではオフ)
 rvalueCast[-]         標準 C++ の明示的な型変換ルールを適用します
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 strictStrings[-]      文字列リテラルを無効にして [char|wchar_t]* にします
                       変換 (C++20 以降では既定でオン、/permissive- によって暗黙的)
 implicitNoexcept[-]   必須関数に対する暗黙的な noexcept を有効にします
 threadSafeInit[-]     スレッドセーフであるローカルの静的な初期化を有効にします
 inline[-]             参照されていない関数またはデータを削除する
                       COMDAT または内部リンケージのみ (既定ではオフ)
 sizedDealloc[-]      C++14 グローバル サイズの割り当て解除を有効にする
                       関数 (既定ではオン)
 throwingNew[-]        演算子 new が失敗時にスローすることを想定しています (既定ではオフ)
 referenceBinding[-]   テンポラリは non-const にバインドされません
                       lvalue 参照 (C++20 以降では既定でオン、/permissive- によって暗黙的)
 twoPhase-             2 フェーズの名前検索を無効にします
 ternary[-]            C++ 11 ルールを条件演算子に適用します
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 noexceptTypes[-]      C ++17 noexcept ルールを適用します (既定では C++17 以降でオン)
 alignedNew[-]         動的に割り当てられたオブジェクトの C++17 のアラインメントを有効にします (既定ではオン)
 hiddenFriend[-]        標準の C++ 隠しフレンド ルールを適用する
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 externC[-]            標準 C++ ルールを 'extern "C"' 関数に適用します
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 lambda[-]             新しいラムダ プロセッサを使用してラムダ サポートを強化します
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 tlsGuards[-]          TLS 変数の初期化のランタイム チェックを生成します (既定ではオン)
 zeroSizeArrayNew[-]   メンバー new または delete をサイズが 0 の配列のオブジェクトに対して呼び出します (既定ではオン)
 static_assert[-]      'static_assert' の厳密な処理 (C++20 以降では既定でオン、
                       /permissive- によって暗黙的に指定されます)
 gotoScope[-]          は変数の初期化を超えることはできません (/permissive- によって暗黙的に指定)
 templateScope[-]      標準 C++ テンプレート パラメーター シャドウ処理ルールを適用する
 enumTypes[-] 標準 C++ の基になる列挙型を有効にする (既定ではオフ)
 checkGwOdr[-]          標準 C++ の 1 つの定義ルール違反を強制する
                       /Gw が有効になっている場合 (既定ではオフ)
 nrvo[-]               オプションのコピーと移動の省略を有効にします (C++20 以降では既定でオン、
                       /permissive- または /O2 によって暗示されます)
 C で __STDC__              を 1 に定義__STDC__
 __cplusplus[-]        __cplusplus マクロは、サポートされている C++ 標準を報告します (既定ではオフ)
 char8_t[-]            C++20 ネイティブ 'u8' リテラル サポートを 'const char8_t' として有効にします
                       (C++20 以降では既定でオン)
 externConstexpr[-] C++ で constexpr 変数の外部リンケージを有効にする
                       (C++20 以降では既定でオン、/permissive- によって暗黙的)
 preprocessor[-]        C/C++ で標準準拠プリプロセッサを有効にする
                       (C11 以降では既定でオン)
/ZI エディット コンティニュのデバッグ情報を有効にする
/openmp OpenMP 2.0 言語拡張を有効にする
/openmp:experimental では、OpenMP 2.0 言語拡張機能が使用可能になり、OpenMP 3.0+ 言語拡張機能が選択されます
LLVM ランタイムが使用されている /openmp:llvm OpenMP 言語拡張

                              -その他-

@<file> オプション応答ファイル
/?, /help このヘルプ メッセージを出力します
/bigobj 拡張オブジェクトの形式を生成する/c コンパイルのみ。リンクなし
/FC 診断で完全パス名を使用する          /H<num> 最大の外部名の長さ
/J 文字型を既定で unsigned にする
/MP[n] はコンパイル時に最大で 'n' 個のプロセスが使用されます
/nologo 著作権メッセージを表示しません
/showIncludes インクルード ファイル名を表示する
/Tc<source file> ファイルを .c としてコンパイルする
/Tp<source file> ファイルを .cpp としてコンパイルする
/TC すべてのファイルを .c としてコンパイルする
/TP すべてのファイルを .cpp としてコンパイルする
/V<string> バージョン文字列を設定します /Yc[file] .PCH ファイルを作成する
/Yd デバッグ情報をすべての .OBJ に保存する
/Yl[sym] デバッグ ライブラリで使用する .PCH 参照を投入する
/Yu[file] .PCH ファイルを使用する       /Y- PCH オプションをすべて無効にする
/Zm<n> 最大メモリの割り当て (既定の %)  /FS 強制的に MSPDBSRV.EXE を使用する
/source-charset:<iana-name>|.nnnn は、ソース文字セットを設定します
/execution-charset:<iana-name>|.nnnn は、実行文字セットを設定します
/utf-8 は、ソースおよび実行文字セットを UTF-8 に設定します
/validate-charset[-] では、有効な文字に対してのみ UTF-8 ファイルが検証されます
/fastfail[-] は、fast-fail モードを有効にします
/JMC[-] は、ネイティブの「マイ コードのみ」を有効にします
/presetPadding[-] スタック ベースのクラス型のパディングをゼロに初期化する
/volatileMetadata [-] は、揮発性メモリアクセスでメタデータを生成します
ソース リンク情報を含む /sourcelink [file] ファイル

                                -リンク-

/LD .DLL を作成する                     /LDd .DLL デバッグ ライブラリを作成する
/LN .netmodule を作成する               /F<num> スタック サイズを設定する
/link [リンカー オプションとライブラリ] /MD MSVCRT.LIB でリンクする
/MT LIBCMT.LIB でリンクする
/MDd MSVCRTD.LIB デバッグ ライブラリでリンクする
/MTd LIBCMTd.LIB デバッグ ライブラリでリンクする

                              -Code Analysis-

/analyze[-] ネイティブの分析を有効にする
/analyze:quiet[-] コンソールに警告を表示しない
/analyze:log<name> ファイルに警告を記録する
/analyze:autolog ログの記録先: *.pftlog
/analyze:autolog:ext<ext> *.<ext> にログを記録する
/analyze:autolog- ログ ファイルなし     /analyze:WX- 致命的でない警告
/analyze:stacksize<num> スタック フレームの最大サイズ
/analyze:max_paths<num> パスの最大数    /analyze:only 分析のみ、コード生成なし

                              -診断-

/diagnostics:<引数,...> 診断メッセージの形式を制御します:
             classic - 以前の形式を保持します
             column[-] - 列情報を出力します
             caret[-] - 列および指定したソース行を出力します
/Wall 警告をすべて有効にする            /w   警告をすべて無効にします
/W<n> 警告レベルを設定する (既定 n=1)
/Wv:xx[.yy[.zzzzz]] はバージョン xx.yy.zzzzz 以降に導入された警告を無効にします
/WX 警告をエラーとして扱います          /WL 1 行診断を有効にします
/wd<n> 警告 n を無効にします            /we<n> 警告 n をエラーとして扱う
/wo<n> 警告 n を 1 回だけ表示します
/w<l><n> n の警告レベルを 1 ~ 4 に設定します
/external:I <path>      – 外部ヘッダーの場所
/external:env:<変数>     – 外部ヘッダーの場所が含まれる環境変数
/external:anglebrackets – <> に含まれているヘッダーすべてを外部ヘッダーとして処理します
/external:W<数字>          – 外部ヘッダーの警告レベル
/external:templates[-]  – テンプレート インスタンス化チェーンにおける警告レベルを評価します
/sdl 追加のセキュリティ機能と警告を有効にする
/options:strict 認識されないコンパイラオプションはエラーです

とりあえず、ミニマムでVisual Studio CodeでCのビルドしてみます

拡張機能は、C/C++(Microsoft)をインストール

open folderでフォルダを開きます

Shift + Ctrl + P で「C/C++: Edit Configurations (UI)」を選択
.vscode/c_cpp_properties.jsonを作成

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\include",
                "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\shared",
                "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\ucrt",
                "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\um"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "compilerPath": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\cl.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64",
            "browse": {
                "path": [
                    "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\include",
                    "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\shared",
                    "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\ucrt",
                    "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\um"
                ]
            }
        }
    ],
    "version": 4
}

ビルドのため、メニューのTerminalからConfigure Tasks を選択
C/C++: cl.exe cuild active fileを選択

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: cl.exe build!",
			"command": "cl.exe",
			"args": [
				"/Zi",
				"/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
				"${file}",
				"/I",
				"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\include",
				"/I",
				"C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\shared",
				"/I",
				"C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\ucrt",
				"/I",
				"C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\um",
				"/link",
				"/LIBPATH:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\lib\\x64",
				"/LIBPATH:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\ucrt\\x64",
				"/LIBPATH:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\um\\x64"
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$msCompile"
			],
			"group": "build",
			"detail": "compiler: cl.exe"
		}
	]
}

設定を再読み込みするため、 Shift + Ctrl + Pで Developer: Reload Windowで更新

適当なソースを作成
ソースコード(Sample.c)は以下

#include <stdio.h>

int main (){
    printf("hello c lang");
    return 0;
}

Shift + Ctrl + b で"C/C++: cl.exe build!"を選択しビルド

Sample.exeがつくられるので実行すると

> .\Sample.exe
hello c lang
投稿日時: 2024-12-09 11:41:09
更新日時: 2024-12-12 14:01:12

最近の投稿

最近のコメント

タグ

アーカイブ

その他