我想不出函数调用中多个星号的任何实际用法:
void foo(int a, char b)
{
}
int main(void)
{
(**************foo)(45, 'c');
//or with pointer to function:
void (*ptr)(int, char) = foo;
(******ptr)(32, 'a');
}
Run Code Online (Sandbox Code Playgroud)
为什么在C和C++中都允许这个东西?
我正在阅读"C++编程语言第4版"一书,并对有关异常处理的段落提出疑问:
在某些情况下,必须放弃异常处理以获得不那么微妙的错误处理技术.指导原则是:
- 处理异常时不要抛出异常.
- 不要抛出无法捕获的异常.
如果异常处理实现捕获您的任何一个,它将终止您的程序.
有人能给我一个第一次看台的例子吗?我只想到这样的东西,但根据g ++它是一个有效的代码:
try
{
throw 1;
}
catch(...)
{
try
{
throw 2;
}
catch(...)
{
cout << "OK";
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道为什么以下代码:
void foo(void);
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
在gcc中有效.在C中,没有重载和上面的声明(事实上,其中一个是定义)声明两个不同的函数(第一个不接受任何参数,第二个可以接受任何数量的参数)类型).
但是,如果我们为第一个函数提供定义:
void foo(void)
{
}
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
由于重新定义,此次编译失败.但是,第一个代码仍然是正确的,可能会令人困惑,如下所示:
void foo(void);
int main(void)
{
foo(); //OK
//foo(5); //Wrong, despite ->the definition<- allows it
}
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
另一方面,这样的事情是无效的:
void foo(int);
void foo() //error: number of arguments doesn't match prototype
{
}
Run Code Online (Sandbox Code Playgroud)
我认为与我的第一个前面的代码相比,编译器的行为有点奇怪.int
是不等于(/*empty list*/)
,也不是void
.
有谁能解释一下?
在C和C++的情况下,我有两个关于同一函数和全局变量的声明的两个问题.
不同的函数声明
请考虑以下代码片段:
file_1.c
void foo(int a);
int main(void)
{
foo('A');
}
Run Code Online (Sandbox Code Playgroud)
file_2.c
#include <stdio.h>
void foo(char a)
{
printf("%c", a); //prints 'A' (gcc)
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,原型与file_2.c中的定义不同 ,但是,该函数会打印预期值.
如果是C++,由于foo(int)
链接时未定义的引用,上述程序无效.它可能是由其他函数签名的存在引起的 - 与C相比,其中函数名称不包含任何指示函数参数类型的额外字符.
但是当涉及到C然后是什么?由于具有相同名称的原型具有相同的签名,无论参数的数量及其类型如何,链接器都不会发出错误.但是在这里执行哪种类型的转换?它看起来像这样:'A'
- >
int
- >回到char
?或者这种行为可能未定义/实现定义?
全局变量的不同声明
我们有两个文件和两个不同的同一个全局变量的声明:
file_1.c
#include <stdio.h>
extern int a;
int main(void)
{
printf("%d", a); //prints 65 (g++ and gcc)
}
Run Code Online (Sandbox Code Playgroud)
file_2.c
char a = 'A';
Run Code Online (Sandbox Code Playgroud)
在C和C++中,输出都是65.
虽然我想知道两种标准对这种情况的看法.
在C11标准中,我发现了以下片段:
J.5.11多个外部定义 (附件J.5公共扩展)
对象的标识符可能有多个外部定义,有或没有明确使用关键字extern; 如果定义不一致,或者初始化了多个,则行为未定义(6.9.2).
请注意,它指的是两个或更多定义的存在,在我的代码中只有一个,所以我不确定这篇文章在这种情况下是否是一个很好的参考点...
我在C11标准中涉及restrict
限定符时遇到了这两个部分:
1#
6.7.3-8
通过限制限定指针访问的对象与该指针具有特殊关联.这种关联在下面的6.7.3.1中定义,要求对该对象的所有访问直接或间接地使用该特定指针的值.135)限制限定符(如寄存器存储类)的预期用途是促进优化,并删除预选赛的所有实例的所有预处理翻译单元组成一个符合规范的程序不会改变它的意义(即,观察到的行为).
你能解释一下草书片段的含义吗?在我的解释中,由于它没有改变它的含义,看起来使用restrict
它只是毫无意义......
2#
6.7.3.1-6
翻译人员可以自由地忽略使用限制的任何或所有别名含义.
这些混叠的含义可能是什么?你能告诉我一些例子吗?
我对C99标准中的默认参数提升有疑问.在"C编程 - 现代方法,第2版"一书中,我读过:
争论转换:
[...]
1)编译器在调用之前遇到了原型.[...]
2)编译器在调用之前没有遇到原型.编译器执行默认参数提升:(1)
float
参数转换为double
.(2)执行整体促销,导致char
和short
参数转换为int
.(在C99中,执行整数提升.)
进一步示出了一些示例,其中在调用它之前没有函数原型或定义.评论如下:
当然,更好的解决方案是
square
在调用之前提供原型.在C99中,在square
没有首先提供函数声明或定义的情况下调用是一个错误.
这两个草书句子是不是彼此相反?我的意思是,如果C99禁止在没有先前声明/定义的情况下调用函数,它如何确定在那种函数调用中的促销?
我在文件中有定点数字,每行一个,这种格式S9(6)V9(2)
但是当它们实际被读取时,我non numeric
在尝试将它们放入数学运算时遇到错误.更重要的是,当我尝试在程序中显示它们时,在文件中写为567123.45的数字将保存在变量中作为+567123.04.例如,文件123.45中的数字在变量中保存为+123.45.00,并且'WS-VALUE' not numeric: '123.45 0'
在数学运算期间会引发以下错误.这是为什么?我正在使用OpenCobolIDE 4.7.4 for Windows.
编辑:文件具有由新行分隔的以下格式的记录(READ
记录后的操作记录读取):
01 WS-OPERATION.
05 WS-ID PIC A(2).
05 WS-CLIENT PIC 9(5).
05 WS-COUNTRY PIC A(4).
05 WS-VALUE PIC S9(6)V9(2).
Run Code Online (Sandbox Code Playgroud) I'm delving into address constant expressions while reading "C++ Programming Language 4th edition" book. It has a short paragraph which describes address constant expressions:
The address of a statically allocated object, such as a global variable, is a constant. However, its value is assigned by the linker, rather than the compiler, so the compiler cannot know the value of such an address constant. That limits the range of constant expressions of pointer and reference type. For example:
Run Code Online (Sandbox Code Playgroud)constexpr const char* …
我在Windows 10上使用OpenCobolIDE 4.7.4(它基于GnuCOBOL)并尝试编译该程序打开一个文件进行阅读:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO 'input.txt'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
01 WS-EOF PIC A(1).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
PERFORM UNTIL WS-EOF='Y'
READ STUDENT INTO WS-STUDENT
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-STUDENT
END-READ
END-PERFORM.
CLOSE …
Run Code Online (Sandbox Code Playgroud) c ×5
c++ ×3
function ×3
cobol ×2
gnucobol ×2
c++11 ×1
c99 ×1
constexpr ×1
dereference ×1
fixed-point ×1
parameters ×1
pointers ×1
promotions ×1
prototype ×1
try-catch ×1
void ×1