Esdger Dijkstraがgoto
を使用すべきではないと言いましたが、彼は神ではありません。私はあなたがそれをやり過ごさない限り、無条件のブランチを使うのはいいと思う。分岐ステートメントを過度に使用して継承を過度に使用することで、コードを作成できない可能性があります。gotoラベルの "expected expression"エラー
とにかく、私はその先制的な反駁で終わったので、ここに私が書いていたプログラムがあります。ファイルからコードを読み込むことになっています(結局、HTMLコードを読みたいのですが、簡単なので簡単なマークアップ言語を使用しています)、enscript
プログラムへの入力として使用できる形式に変換します。
#include <stdio.h>
#include <stdlib.h>
#define INPUT_ERROR 1
void writecolor(FILE *, float, float, float);
unsigned short hextonum(char);
char escape = '\0'; // Default for enscript
int main(int argc, char **argv){
FILE *in;
FILE *out;
if(argv[1]){
in = fopen(argv[1], "r");
}
else{
in = stdin;
}
if(argv[2]){
out = fopen(argv[2], "w");
}
else{
out = stdout;
}
char c; // Input character
float red; // Red value from hex code
float green; // Green value from hex code
float blue; // Blue value from hex code
int line = 1; // Current line number, used for error reporting
while((c = fgetc(in)) != EOF){
if(c == '\\'){
if(fgetc(in) == '#'){
red = (float) hextonum(fgetc(in)) * 10/16 * 0.1 + (float) hextonum(fgetc(in)) * 10/16 * 0.01;
green = (float) hextonum(fgetc(in)) * 10/16 * 0.1 + (float) hextonum(fgetc(in)) * 10/16 * 0.01;
blue = (float) hextonum(fgetc(in)) * 10/16 * 0.1 + (float) hextonum(fgetc(in)) * 10/16 * 0.01;
writecolor(out, red, green, blue);
}
}
else{
fputc(c, out);
}
if(c == '\n'){
line++;
}
}
fclose(in);
fclose(out);
return 0;
:infile_error // XXX goto in hextonum branches here
fprintf(stderr, "%s: Error on line %d of input file.\n", argv[0], line);
return INPUT_ERROR;
}
// Converts a color code in the markup to a color code
// recognized by enscript
void writecolor(FILE *fp, float red, float green, float blue){
fwrite(&escape, 1, 1, fp);
fprintf(fp, "color{%f %f %f}", red, green, blue);
}
// Converts a hex digit to its corresponding value
unsigned short hextonum(char hex){
if(hex >= '0' && hex <= '9'){
return atoi(hex);
}
switch(hex){
case('a') : case('A') : return 0xa;
case('b') : case('B') : return 0xb;
case('c') : case('C') : return 0xc;
case('d') : case('D') : return 0xd;
case('e') : case('E') : return 0xe;
case('f') : case('F') : return 0xf;
}
// Okay, I think rather than putting an if statement
// around every piece of code that uses this function,
// I'm just going to jump to an error code in the
// main function.
goto infile_error;
}
これは非常に多くの作業が進行中であり、現時点では完璧なものから機能していないものまであります。私は、次のエラーを取得しておくなぜ私は思ったんだけど:
html2enscript.c:50:2: error: expected expression
:infile_error // XXX goto in hextonum branches here
^
が、これはここでは、コンパイラ強制グッドプラクティスルールのいくつかの種類です、または、ない私が実際に間違って何かを(そして間違ったことで、私は間違った構文的に意味しましたちょうど悪いプログラミングスタイル)?
追加情報:
はここに私のgcc
バージョン情報である:ここ
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
ああ、うーん、意味がある!私はラベルをする方法を完全に忘れていました。 – user628544
'goto'は1つの関数内でしか分岐できないことに注意してください。関数間で分岐することはできません。 –
'goto'にはそのアプリケーションがあります。しかしあなたのものは誰もいません。ここでエラーを処理するためのより良い方法があります。 (@ JohnBodeが指摘しているように、それを無効にすることはできません)。 – Olaf