C ++, C2447 '{': отсутствует заголовок функции (список форматов старого стиля?), Win32 и long - PullRequest
0 голосов
/ 23 сентября 2019

Я получаю сообщение об ошибке при создании решения на основе существующего кода для обучения.Я определил препроцессор Win32 (как и должно быть), а сам код имеет значение https://www.nayuki.io/page/bitcoin-cryptography-library. Кажется, что ошибка создается значением long, которое может быть причиной этой ошибки (используется win32, а неwin64).Я пытался преодолеть написание этого по-разному (используя long / ulong / int), но безуспешно.

static long long opsCount;

void countOps(long n){
    opsCount += n;
}

Любые предложения, как написать это другим способом и решить эту плохую погоду в списке ошибок?

/* 
 * A runnable main program that calculates and prints the approximate
 * number of 32-bit arithmetic operations needed to perform
 * elliptic curve point multiplication, in this C++ implementation.
 * 
 * Bitcoin cryptography library
 * Copyright (c) Project Nayuki
 * 
 * https://www.nayuki.io/page/bitcoin-cryptography-library
 * https://github.com/nayuki/Bitcoin-Cryptography-Library
 */

#include <cstddef>
#include <cstdlib>
#include <iostream>
#include <string>
#include "CountOps.hpp"
#include "CurvePoint.hpp"
#include "Ecdsa.hpp"
#include "FieldInt.hpp"
#include "Sha256.hpp"
#include "Sha256Hash.hpp"
#include "Uint256.hpp"


static long long opsCount;


void countOps(long n){
    opsCount += n;
}



static void printOps(const char *name);
static void doUint256();
static void doFieldInt();
static void doCurvePoint();
static void doEcdsa();


int main() {
    doUint256();
    doFieldInt();
    doCurvePoint();
    doEcdsa();
    return EXIT_SUCCESS;
}


static void doUint256() {
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x.replace(y, 1);
        printOps("uiReplace");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x.swap(y, 1);
        printOps("uiSwap");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x == y;
        printOps("uiEquals");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x < y;
        printOps("uiLessThan");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x.add(y);
        printOps("uiAdd");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x.subtract(y);
        printOps("uiSubtract");
    }
    {
        Uint256 x = Uint256::ONE;
        opsCount = 0;
        x.shiftLeft1();
        printOps("uiShiftLeft1");
    }
    {
        Uint256 x = Uint256::ONE;
        opsCount = 0;
        x.shiftRight1();
        printOps("uiShiftRight1");
    }
    {
        Uint256 x = Uint256::ONE;
        Uint256 y = CurvePoint::ORDER;
        opsCount = 0;
        x.reciprocal(y);
        printOps("uiReciprocal");
    }
    std::cout << std::endl;
}


static void doFieldInt() {
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x.replace(y, 1);
        printOps("fiReplace");
    }
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x == y;
        printOps("fiEquals");
    }
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x < y;
        printOps("fiLessThan");
    }
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x.add(y);
        printOps("fiAdd");
    }
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x.subtract(y);
        printOps("fiSubtract");
    }
    {
        FieldInt x(Uint256::ONE);
        opsCount = 0;
        x.multiply2();
        printOps("fiMultiply2");
    }
    {
        FieldInt x(Uint256::ONE);
        FieldInt y(Uint256::ONE);
        opsCount = 0;
        x.multiply(y);
        printOps("fiMultiply");
    }
    {
        FieldInt x(Uint256::ONE);
        opsCount = 0;
        x.square();
        printOps("fiSquare");
    }
    {
        FieldInt x(Uint256::ONE);
        opsCount = 0;
        x.reciprocal();
        printOps("fiReciprocal");
    }
    std::cout << std::endl;
}


static void doCurvePoint() {
    {
        CurvePoint x = CurvePoint::G;
        CurvePoint y = CurvePoint::G;
        opsCount = 0;
        x.replace(y, 1);
        printOps("cpReplace");
    }
    {
        CurvePoint x = CurvePoint::G;
        opsCount = 0;
        x.isZero();
        printOps("cpIsZero");
    }
    {
        CurvePoint x = CurvePoint::G;
        CurvePoint y = CurvePoint::G;
        opsCount = 0;
        x == y;
        printOps("cpEquals");
    }
    {
        CurvePoint x = CurvePoint::G;
        opsCount = 0;
        x.twice();
        printOps("cpTwice");
    }
    {
        CurvePoint x = CurvePoint::G;
        CurvePoint y = CurvePoint::G;
        opsCount = 0;
        x.add(y);
        printOps("cpAdd");
    }
    {
        CurvePoint x = CurvePoint::G;
        Uint256 y = Uint256::ONE;
        opsCount = 0;
        x.multiply(y);
        printOps("cpMultiply");
    }
    {
        CurvePoint x = CurvePoint::G;
        opsCount = 0;
        x.normalize();
        printOps("cpNormalize");
    }
    {
        CurvePoint x = CurvePoint::G;
        opsCount = 0;
        x.isOnCurve();
        printOps("cpIsOnCurve");
    }
    std::cout << std::endl;
}


static void doEcdsa() {
    {
        Uint256 privKey = Uint256::ONE;
        Sha256Hash msgHash = Sha256::getHash(nullptr, 0);
        Uint256 nonce = Uint256::ONE;
        Uint256 outR, outS;
        opsCount = 0;
        Ecdsa::sign(privKey, msgHash, nonce, outR, outS);
        printOps("edSign");
    }
    {
        CurvePoint pubKey = CurvePoint::G;
        Sha256Hash msgHash = Sha256::getHash(nullptr, 0);
        Uint256 r = Uint256::ONE;
        Uint256 s = Uint256::ONE;
        opsCount = 0;
        Ecdsa::verify(pubKey, msgHash, r, s);
        printOps("edVerify");
    }
    std::cout << std::endl;
}


static void printOps(const char *name) {
    std::string s = std::to_string(opsCount);
    while (s.size() < 9)
        s.insert(0, " ", 1);
    for (std::size_t i = s.size(); i >= 4; i -= 3)
        s.insert(i - 3, " ", 1);
    std::cout << s << "  " << name << std::endl;
}

Вот ошибки:

image

1 Ответ

0 голосов
/ 28 сентября 2019

Для дальнейшего использования вы должны поработать над тем, чтобы ваш пример был хорошим Минимальный воспроизводимый пример .Это не только повысит вероятность того, что вы получите ответ о переполнении стека, но, скорее всего, сделает его таким, что вы сможете сами начать исправлять проблемы.

Например, это единственная функция, с которой у вас возникают проблемы:

#define countOps(n)
static long long opsCount;
void countOps(long n){
    opsCount += n;
}

Если вы попытаетесь скомпилировать только это в файл .cpp, это сработает, хотя и будет жаловаться на отсутствие точки входа.Итак, #include должно быть причиной проблемы.Очевидный кандидат CountOps.hpp, где это объявлено.В этом случае, если вы не #define COUNT_OPS, заголовок будет просто

#define countOps(n)

Так что если мы соединим эти две части вместе, у нас будет минимальный, воспроизводимый пример вашей ошибки компиляции:

#define countOps(n)
static long long opsCount;
void countOps(long n){
    opsCount += n;
}

Другими словами, включенный файл пытается #define убрать функцию countOps, и, реализуя ее, препроцессор превращает ваш код в

static long long opsCount;
void {
    opsCount += n;
}

, что делаетне имеет смысла.Вы можете исправить это либо с помощью #define COUNT_OPS перед включением CountOps.hpp, либо просто не пытаясь создать эту функцию.Правильный путь зависит от того, как эта библиотека предназначена для использования.

Моя цель не в том, чтобы рассказать вам, как решить эту проблему, а, надеюсь, помочь вам понять, как обнаружить ее в будущем, чтобы вы моглипонять, что происходит, и почему это происходит, или, по крайней мере, помочь другим, пытающимся помочь вам.

И еще один последний момент: предположим, что ваши изображения никогда не будут видны.Мало того, что некоторые пользователи будут иметь проблемы с их просмотром, но другой пользователь, который ищет вашу проблему в будущем, не увидит ее, поэтому он извлекает уроки из того, что другие могут извлечь из вашего вопроса.Ваш компилятор выдаст эти ошибки в тексте на некотором уровне.Вы должны скопировать n-paste оттуда.

...