- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是的,我知道 Esdger Dijkstra 说你不应该使用 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
最佳答案
这里有两个问题。第一个是您的 goto
标签指定不正确。
你有这个:
:infile_error
应该是这样的:
infile_error:
第二个问题较大,是您试图使用 goto
跳转到另一个函数。这是不允许的。
看来您正在尝试实现某种异常机制。然而,这在 C 中不受支持。
执行此操作的正确方法是让函数返回一些指定错误的值,然后在函数退出时检查该值。
如果您真的想要执行非本地goto
,您可以使用setjmp
和longjmp
>。这与 C 中的异常处理非常接近。
jmp_buf hextonum_err;
int main( int argc, char **argv ){
...
if (setjmp(hextonum_err) != 0) {
goto infile_error;
}
while( (c = fgetc( in )) != EOF ){
...
}
unsigned short hextonum( char hex ){
if( hex >= '0' && hex <= '9' ){
// don't use atoi here as that expects a string
return hex - '0';
}
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;
}
longjmp(hextonum_err, 1);
// never reached, but put here because compiler will warn on non returning a value
return 0;
}
一般来说,我不推荐这样写代码。
关于c - "expected expression"goto 标签错误(非本地 goto),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40247209/
在 Windows 世界中,什么是正确的名称。具有导出函数的老式 C++ DLL?不是 COM DLL,也不是 .NET DLL。我们以前通过调用 LoadLibrary() 和 GetProcAdd
目前我正在使用javaEE7,我有一个场景如下。在我的 JSF Web 应用程序中,我有一个事件监听器(不是 JSF 事件),当事件调用时,它会执行某些操作,然后将这些信息更新到我的 Web 应用程序
这不是 AJAX 请求/响应回调问题... 我正在使用 Dojo 1.5 构建网格。我正在尝试 dojo.connect具有功能的扩展/收缩按钮。我的问题是 grid.startup()在创建实际 D
非 Webkit Opera 是 very specific在某些功能中,因此通常通过 JavaScript 检测到 the following way . 但是,Opera Next 几乎是 Goo
我已查看以下链接中给出的所有日志,但未能找到 IP 地址: https://developer.couchbase.com/documentation/server/3.x/admin/Misc/Tr
我有一个命令行程序,它根据一组源文件生成一个我想在我的 Android gradle 构建 (A) 中使用的 jar 文件。这个命令行程序只是将一个 jar 文件存储在磁盘上的一个目录中。 我如何创建
下面的 htaccess 命令将所有非 www 转移到 http www RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^
我正在使用自定义链接器脚本将内核镜像分为两部分。第一个是普通代码和数据,第二个是初始化代码和不再需要时将被丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,因此如果 fork() 仍然存在(
这个问题在这里已经有了答案: Several unary operators in C and C++ (3 个答案) What is the "-->" operator in C++? (29
假设我有一个类设置如下: class A { public: virtual void foo() { printf("default implementation\n"); } }; c
#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) {
近期,百度搜索引擎变化无常,很多企业站、行业站、门户站、论坛等站点遭到了降权,特别是比比贴分类信息网直接遭到了拔毛,这对于广大站长来说是一种打击,也是各个企业、行业的打击。 至今,很多网站已经恢复
我现在正在使用 IBM TPM v1332 + IBM TSS v1470 并尝试将一些基本关键字/密码存储到 TPM 上的非 volatile 内存中。我找到了两种方法。一种是创建一个密封对象并使用
我的 PHP 脚本中有一个正则表达式,如下所示: /(\b$term|$term\b)(?!([^)/iu 这与 $term 中包含的单词匹配,只要前后有单词边界并且它不在 HTML 标记内即可。 但
我想显示用户名称地址(请参阅 www.ipchicken.com ),但我唯一能找到的是 IP 地址。我尝试了反向查找,但也没有用: IPAddress ip = IPAddress.Parse(th
只有 UI 线程能够显示到屏幕上,还是其他线程也可以这样做? 最佳答案 不,您只能直接从 UI 线程访问 UI,但您可以编码来自其他线程的结果,例如使用 Control.Invoke 或 contro
我正在使用现代 Excel 滚动条(不是旧的 ActiveX 类型,即开发人员 > 插入 > 表单控件 > 滚动条)并且想检测它的值何时更改。我找不到有关此类对象的更改事件的任何信息。您可以在单击时分
当我使用这段代码时 IE 6 确实正确使用了指定的样式表,但所有其他浏览器在应该使用基本上声明的样式表时会忽略这两种样式表,如果您不是 IE,请使用此样式表。 有什么想法吗? 最佳答案 n
我想指定 2 mssql 表之间的关系。 付款类别和付款。 paymentcategory.id 加入 payout.category 列。 在 payout.json 模型中 我指定为外键:id,
我正在尝试制作非 volatile UDF,但似乎不可能。因此,这是我非常简单的test-UDF: Option Explicit Dim i As Integer Sub Main() i = 0
我是一名优秀的程序员,十分优秀!