0

アセンブラーの小さなコードについては、それらをバッチファイルに入れて直接コンパイルするか、リモートの Windows マシンでコンパイルするのが非常に快適です。

これは、MASM32 で動作するように設計された私の作業用 .bat ファイルです。

;@goto end
.486
.model flat,stdcall
option casemap:none

include     \masm32\include\kernel32.inc  
include     \masm32\include\user32.inc
includelib  \masm32\lib\user32.lib
includelib  \masm32\lib\kernel32.lib

.data
      msg   db   "Hello Word",0
.code   
start:
  push 0
  push offset msg
  push offset msg
  push 0
  call MessageBox
  push 0
  call ExitProcess
end start

:end
@echo off
set name=%~n0
set cmpname=ml.exe
set linkname=link.exe
for %%X in (%cmpname%) do (set CMPL=%%~$PATH:X)
if defined CMPL ( 
  for %%I in (%linkname%) do (set MLINK=%%~$PATH:I)
    if defined MLINK (    
    %CMPL% /nologo /c /coff /Cp %name%.bat
    %MLINK% /SUBSYSTEM:WINDOWS /FIXED:NO %name%.obj
    del *.obj
    ) ELSE ( 
      ECHO Cannot find %linkname% !
   )
) ELSE ( 
  ECHO Cannot find %cmpname% !
)       
exit /b %ERRORLEVEL%

私の問題:
たとえば、GCCで作業しようとするとき

;@goto end
#include <stdio.h>
int  main()
{ 
   return 0;
}
:end
;@echo off

set name=%~n0
set cmpname=gcc.exe
for %%I in (%cmpname%) do (set CMPL=%%~$PATH:I)
if defined CMPL (    
%CMPL% -Wall -o %name% %name%.bat
del *.obj
    ) ELSE ( 
    echo Cannot find %cmpname% !
    )
exit /b %ERRORLEVEL% 

最初のエラー:
\CodeBlocks\MinGW\bin\gcc.exe は現時点では予期されていませんでした。これ
を検索して見つけた後、次のように変更しました。

for %%I in (%cmpname%) do (set CMPL="%%~$PATH:I")

それを解決しますが、新しいエラーがあります:
testc.bat: ファイルが認識されません: ファイル形式が認識されません collect2.exe: エラー: ld が 1 終了ステータスを返しました

私の質問は
、上記のバッチ ファイルを C/C++ コンパイラで動作させることは可能ですか?

4

1 に答える 1

3

プリミティブ型の 1 つに一致する追加の何もしないコマンドをファイルシステムに配置したい場合は、次のようなものを使用できます。

int /*
;@echo off
set name=%~n0
set cmpname=gcc.exe
for %%I in (%cmpname%) do (set CMPL=%%~$PATH:I)
if defined CMPL (    
%CMPL% -Wall -o %name% %name%.bat
del *.obj
    ) ELSE ( 
    echo Cannot find %cmpname% !
    )
exit /b %ERRORLEVEL% 
*/ dummy;
#include <stdio.h>
int  main()
{ 
   return 0;
}

複数行のコメントを考慮していない以前の回答: できません。

C++ コードをコンパイラに渡すバッチ ファイルを作成できますが、C++ コードを生成する必要があります。有効なバッチと有効な C++ の両方であるファイルを作成することはできません。

本質的な理由は、C++ にはファイルの処理を停止するコマンドがなく、C++ プリプロセッサ コマンドには空白以外の先行文字を使用できないためです。

#これは、C++ と、コメント プレフィックスとして扱う任意の言語との間でマルチ ID ファイルを作成できることを意味します。(次に、他の言語で処理されるスクリプト全体を#if 0...内に含めるだけです#endif)。しかし、バッチはそのような言語ではありません。

于 2013-07-06T04:17:17.810 に答える