Tag: 语法

在C中使用模板function的最短例子?

我如何处理函数echo_tpl ,它可以采用int或string类型的1个参数,并将其打印出来?

Bison / Yacc语法中的无意连接

我正在尝试使用lex和yacc并遇到一个奇怪的问题,但我认为最好在详细说明问题之前向我们展示我的代码。 这是我的词法分析员: %{ #include #include #include “y.tab.h” void yyerror(char *); %} %% [a-zA-Z]+ { yylval.strV = yytext; return ID; } [0-9]+ { yylval.intV = atoi(yytext); return INTEGER; } [\n] { return *yytext; } [ \t] ; . yyerror(“invalid character”); %% int yywrap(void) { return 1; } 这是我的解析器: %{ #include int yydebug=1; void prompt(); void yyerror(char […]

C ++:0和0.0之间的差异?

我很清楚0和0.0 (int和double)之间的区别。 但是0.和0.0之间有什么区别(请注意。)? 非常感谢提前, 阿克塞尔

init-declarator-list和GNU GCC属性语法

我正在改进一个内部C语言野牛/基于flex的解析器,其中包括引入正确的__ attribute__支持。 因为我找不到任何描述GNU GCC __ attribute__想法的官方BNF风格的语法(除了http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html文档),我从C中提取点点滴滴通过网络找到的各种实现中的++ x11标准和注释。 我几乎完成了它(至少在解析上面引用的GCC文档中包含的示例时),但是一个特定的例子令我头疼,外部资源没有提示解决方案。 示例如下: __attribute__((noreturn)) void d0 (void), __attribute__((format(printf, 1, 2))) d1 (const char *, …), d2 (void); 附件说明: 属性说明符列表可以使用单个说明符和限定符列表,在多个标识符的声明中以逗号分隔的声明符列表中的声明符(不是第一个)之前出现。 此类属性说明符仅适用于它们出现在其声明符之前的标识符。 因此,引导我解决这个问题: init-declarator-list: init-declarator init-declarator-list , attribute-specifier-seq[opt] init-declarator 我知道它有效,但如果这是解决上述案例的正确方法,我想寻求validation/支持。 谢谢, 沃伊切赫 编辑:这个链接(虽然有点过时)给出了一个像我一样的解决方案: http : //plg.uwaterloo.ca/~cforall/gcc.y奇怪的是,我之前没有偶然发现它,只是在我做的时候搜索__ extension__关键字。

为什么左侧的“取消引用”和“地址”运营商?

在C(以及一些其他类C语言)中,我们有2个一元运算符用于处理指针:解引用运算符( * )和’运算符地址’( & )。 它们是一元运算符,它引入了操作顺序的不确定性,例如: *ptr->field 要么 *arr[id] 操作的顺序由标准严格定义,但从人的角度来看,这是令人困惑的。 如果*运算符是一个正确的一元运算符,则顺序很明显,不需要额外的括号: ptr*->field vs ptr->field* 和 arr*[id] vs arr[id]* 因此,运营商为什么会离开一元而不是正确,这是有充分理由的。 我想到的一件事是类型的声明。 左操作符保持在类型名称附近( char *a vs char a* ),但是有类型声明,已经破坏了这个规则,所以为什么要打扰( char a[num] , char (*a)(char)等) 。 显然,这种方法也有一些问题,比如 val*=2 对于val = val * 2或dereference并指定val* = 2这将是*=短手。 然而,这可以通过在解除引用的情况下在*和=令牌之间需要空白来容易地解决。 再一次,没有任何开创性的,因为有这样一个规则的先例( – -a vs –a )。 那么为什么他们离开而不是正确的运营商呢? 编辑:我想指出,我问了这个问题,因为C的许多更奇怪的方面都有有趣的解释,为什么它们是这样的,就像->运算符或类型声明或索引的存在一样从0开始。依此类推。 原因可能不再有效,但我认为它们仍然很有趣。

“FOLLOW_set_in_”…在生成的解析器中未定义

我已经为类似Java的DSL编写了一个语法。 虽然它仍然存在一些问题(它不能像我希望的那样识别所有输入),但最让我担心的是生成的C代码是不可编译的。 我使用AntlrWorks 1.5和Antlr 3.5(Antlr 4显然不支持C目标)。 问题在于表达规则。 我有规则prio14Expression到prio0Expression,它处理运算符优先级。 问题是优先级2,它评估前缀和后缀运算符: … prio3Expression: prio2Expression ((‘*’ | ‘/’ | ‘%’) prio2Expression)*; prio2Expression: (‘++’ | ‘–‘ | ‘!’ | ‘+’ | ‘-‘)* prio1Expression (‘++’ | ‘–‘)*; prio1Expression: prio0Expression ( (‘.’ prio0Expression) | (‘(‘ (expression (‘,’ expression)*)? ‘)’) | (‘[‘ expression (‘,’ expression)* ‘]’) )*; prio0Expression: /*(‘(‘) => */(‘(‘ expression […]

在多行上定义一个字符串

请采取以下措施: char buffer[512]; memset(buffer, 0, sizeof(buffer)); sprintf(&buffer[0],”This Is The Longest String In the World that in text goes on and..”); printf(“Buffer:%s\r\n”,buffer); 我希望能够在多行上创建此字符串,以便于故障排除和编辑。 但是,当我使用\命令时,我的输出被看似是标签的东西分开了? 例: sprintf(&buffer[0],”This Is The\ Longest String In the World\ that in text goes on and..”); 产生一个输出: Buffer:This Is The Longest String In the World that in text goes on and.. 有任何想法吗? 这只是一种尝试在多行代码中分解字符串的错误方法吗?

在C中用括号分配两个值

C中的这段代码做了什么: p = (1, 2.1); 我们对p什么了解?

typedef函数作为另一个函数的参数

typedef int (xxx)(int yyy); 表示使用整数参数定义一个名为xxx的函数。 你可以看到这篇SOpost了解详情。 我用不同的方式试过这个,那就是我的代码: #include #include typedef int (xxx)(int yyy); void f1(xxx a) { printf(“f1:%d\n”,a); } void f2(xxx *a) { printf(“f2:%d\n”,a); } int test(int y) { } int main() { xxx *a; f1(test); f1(a); f2(test); f2(a); xxx b; printf(“xxx’s size:%d\n”, sizeof(b)); } 输出: f1:4199274 f1:2 f2:4199274 f2:2 xxx’s size:1 我的问题: f(xxx a)与f(xxx […]

如何理解“typedef int(xxx)(int yyy);”?

typedef int (xxx)(int yyy); 似乎定义了一个名为xxx的函数指针,它指向一个带有整数参数yyy的函数。 但我无法理解语法……任何人都可以给出一个很好的解释吗? 我找到了typedef int xxx(int yyy); 仍然有效。 他们之间有什么区别?