小编Que*_*tin的帖子

在函数调用中使用多个星号有什么用?

我想不出函数调用中多个星号的任何实际用法:

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 c++ function-pointers function-call dereference

36
推荐指数
3
解决办法
2141
查看次数

处理异常时抛出异常

我正在阅读"C++编程语言第4版"一书,并对有关异常处理的段落提出疑问:

在某些情况下,必须放弃异常处理以获得不那么微妙的错误处理技术.指导原则是:

  • 处理异常时不要抛出异常.
  • 不要抛出无法捕获的异常.

如果异常处理实现捕获您的任何一个,它将终止您的程序.

有人能给我一个第一次看台的例子吗?我只想到这样的东西,但根据g ++它是一个有效的代码:

try
{
    throw 1;
}
catch(...)
{
    try
    {
        throw 2;
    }
    catch(...)
    {
        cout << "OK";
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling try-catch

9
推荐指数
1
解决办法
2319
查看次数

两个带有void和空参数列表的函数声明

我想知道为什么以下代码:

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 parameters function void

6
推荐指数
1
解决办法
2316
查看次数

两个文件中相同函数/全局变量的不同声明

在C和C++的情况下,我有两个关于同一函数和全局变量的声明的两个问题.

  1. 不同的函数声明

    请考虑以下代码片段:

    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?或者这种行为可能未定义/实现定义?

  2. 全局变量的不同声明

    我们有两个文件和两个不同的同一个全局变量的声明:

    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).

    请注意,它指的是两个或更多定义的存在,在我的代码中只有一个,所以我不确定这篇文章在这种情况下是否是一个很好的参考点...

c c++ function global-variables forward-declaration

6
推荐指数
1
解决办法
907
查看次数

限制关键字 - 优化和别名含义

我在C11标准中涉及restrict限定符时遇到了这两个部分:

1#

6.7.3-8

通过限制限定指针访问的对象与该指针具有特殊关联.这种关联在下面的6.7.3.1中定义,要求对该对象的所有访问直接或间接地使用该特定指针的值.135)限制限定符(如寄存器存储类)的预期用途是促进优化,并删除预选赛的所有实例的所有预处理翻译单元组成一个符合规范的程序不会改变它的意义(即,观察到的行为).

你能解释一下草书片段的含义吗?在我的解释中,由于它没有改变它的含义,看起来使用restrict它只是毫无意义......

2#

6.7.3.1-6

翻译人员可以自由地忽略使用限制的任何或所有别名含义.

这些混叠的含义可能是什么?你能告诉我一些例子吗?

c compiler-optimization restrict-qualifier

5
推荐指数
2
解决办法
594
查看次数

C99标准中的默认参数促销

我对C99标准中的默认参数提升有疑问.在"C编程 - 现代方法,第2版"一书中,我读过:

争论转换:

[...]

1)编译器在调用之前遇到了原型.[...]

2)编译器在调用之前没有遇到原型.编译器执行默认参数提升:(1)float参数转换为double.(2)执行整体促销,导致charshort参数转换为int.(在C99中,执行整数提升.)

进一步示出了一些示例,其中在调用它之前没有函数原型或定义.评论如下:

当然,更好的解决方案是square在调用之前提供原型.在C99中,在square没有首先提供函数声明或定义的情况下调用是一个错误.

这两个草书句子是不是彼此相反?我的意思是,如果C99禁止在没有先前声明/定义的情况下调用函数,它如何确定在那种函数调用中的促销?

c promotions prototype function c99

4
推荐指数
1
解决办法
695
查看次数

从COBOL中的文件中读取浮点数

我在文件中有定点数字,每行一个,这种格式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)

cobol fixed-point gnucobol

4
推荐指数
1
解决办法
391
查看次数

Address Constant Expressions

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:

constexpr const char* …
Run Code Online (Sandbox Code Playgroud)

pointers constexpr c++11

3
推荐指数
1
解决办法
686
查看次数

打开文件以便在COBOL中读取

我在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)

cobol gnucobol

2
推荐指数
1
解决办法
2506
查看次数