小编Tug*_*.44的帖子

typedef函数指针和extern关键字

我在使用typedef理解指向函数的指针的语法时遇到了问题.我已经阅读了很多答案,但仍然无法理解.我会试着解释一下我是如何看待事物的,这样你才能理解我的想法.

因此我们使用typedef为现有类型提供别名,例如:

typedef int number;
Run Code Online (Sandbox Code Playgroud)

这样我们可以使用与整数相同的数字(类似于预处理器指令 - 我知道在制作指针的typedef时会有一些差异).另一个例子 :

typedef struct
{
    int num;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

将为未命名的结构提供名为MyStruct的别名.

所以这是函数typedef指针的语法:

typedef int (*pFunc)(int, int);
Run Code Online (Sandbox Code Playgroud)

也许我很难理解这一点,因为typedef就像它给TYPES赋予别名的名字而且函数不是完全类型但是无论如何,根据我的理解,这更像是指向某种函数签名的指针,所以第一个int是返回的类型,第二个括号用于指示传递给函数的参数是什么类型.现在我不太明白这一部分:

(*pFunc)
Run Code Online (Sandbox Code Playgroud)
  • 我认为是,我们创建一个名为pFunc的新类型(使用typedef),它是一个指针,它是*的作用.现在我们可以创建这种类型的变量,它将指向具有我们描述的签名的ANY函数.我对么 ?

好吧,说我是对的,通常指向一些内存的指针声明如下:

int *p;
double *p;
.
.
.
Run Code Online (Sandbox Code Playgroud)

因此,按照以下方式进行操作会更有意义:

(pFunc*)
Run Code Online (Sandbox Code Playgroud)

因为对我而言,如果星号位于名称之前,它看起来像pFunc是某种类型的类型指针的变量名,而不是实际的类型指针.

  • 我们能做到吗?如果是这样,它是否常用于将星号放在之后而不是之前?如果它之前更常见的那么为什么呢?正如我说的那样,当我们定义指针类型时,我们总是将星号放在名称本身之后,就像上面的例子那样,为什么会这样呢?
  • 关于这一点的另一个问题,我不太明白*pFunc周围括号的作用是什么. 我认为它们用于表示pFunc类型指针的某些东西,如果我们不做括号,那么签名的返回类型将是int*类型而不仅仅是int,我在这里是否正确?

好吧,另一件困扰我的事情就是语法的顺序.到目前为止,在所有typedef定义中,我们左边是类型,右边是别名.

typedef int number;

typedef struct
{
    int num;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

我们看到int和struct是左边的类型,我们给它们的别名是右边的.

现在,在指向函数typedef的指针中,它不遵循此约定.我们在右边的函数返回了类型,然后是括号中的typename,然后是括号中的参数类型,这个顺序让我在查看其他typedef如何处理相同的顺序后感到困惑.

  • 做这样的事情会不会更有意义?:

    typedef int (int,int) Func;所以我们首先得到一个typedef,我们想要给别名的类型,在这种情况下是一个函数签名,它取2个int并返回一个int,然后在右边我们有别名.它会更有意义吗?这跟随其他的typedef顺序,我只是没有得到那么多的函数指针顺序..

  • 我的另一个问题:当我们指向一个函数时,它实际意味着什么?我知道我们可以使用别名来调用这个函数,但像变量这样的指针存储在一个内存地址中?什么是存储功能?
  • 最后,我已经读过关键字extern与指向函数的指针有关但无法理解这个关键字的作用,有人可以向我解释它的作用吗?

c typedef function-pointers extern

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

使用delete调用析构函数

执行以下操作是否正确:

MyClass mc1(1, 1);
MyClass* pmc1 = &mc1;
delete pmc1;
Run Code Online (Sandbox Code Playgroud)

我在代码示例中看到了它.我以为我们可以在指向堆上分配的对象的指针上调用delete但是这个指针指向堆栈上的对象,不是吗?有人可以解释一下吗.

c++ destructor delete-operator

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

违反尝试写入地址0xFDFDFDFD

我无法弄清楚为什么,但这是我的代码:

    char expression[256] = {};
    cin >> expression;
    cout << endl;
    int** variableTable = NULL;
    int numOfVals = getNumberOfVariables(expression);
    variableTable = static_cast<int**>(calloc(numOfVals, sizeof(int*)));
    for (int i = 0; i < numOfVals; i++)
    {
        variableTable[i] = static_cast<int*>(calloc(2, sizeof(int)));
    }
    fillPromoterTable(expression, variableTable, numOfVals);
Run Code Online (Sandbox Code Playgroud)

这是fillPromoterTable

void fillPromoterTable(const char* expression, int** variableTable, int numOfVals)
{
    char promoter[15] = {};
    char *token;
    char* expCpy = pcstrdup(expression);
    for (int i = 0; numOfVals; i++)
    {
        token = strtok(expCpy, "+-*/");
        int nLen = istrlen(token);
        for (int j …
Run Code Online (Sandbox Code Playgroud)

c++ access-violation

0
推荐指数
1
解决办法
284
查看次数

C++ - 从ifstream读取字符

我正在尝试从文件中读取字符,但陷入无限循环,这是代码:

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream ifs("ifile.txt", ios_base::in);
    int b;
    while ((b = ifs.get()) != EOF)
    {
        cout << b << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在正在创建 .exe 文件的项目 Debug 文件夹中创建了一个名为 ifile.txt 的文件(我使用的是 Microsoft Visual Studio 2013)

当我运行它时,它陷入无限循环。不知道为什么会发生这种情况,但我认为它可能与我创建 ifile.txt 的地方有关?

c++ fstream file visual-studio-2013

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