是的,我知道Esdger Dijkstra說你不應該使用goto
,但他不是上帝。只要你不過分,我認爲可以使用無條件分支。您可能會像過度使用分支語句一樣,過度使用繼承來創建不可讀的代碼。goto label上的「expected expression」錯誤(non-local goto)
無論如何,現在我已經完成了先發制人的反駁,這是我寫的程序。它應該讀取文件中的代碼(最終我希望它讀取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'只能在單個函數內分支;你不能用它來分支功能。 –
'goto'有其應用。但是你的沒有。這裏有更好的方法來處理錯誤。 (讓@JohnBode指出它是無效的)。 – Olaf