Очень простая компиляция на Solaris 10 - PullRequest
0 голосов
/ 09 августа 2011

Я на Солярисе 10 коробка.Я использую компилятор: /opt/solstudio12.2/bin/CC

Сбой при компиляции файла, показанного ниже (myTest2.C).

% CC -I. -o myTest2 myTest2.C
"myTest2.C", line 30: Error: "{" expected instead of "myFunc".
"myTest2.C", line 33: Error: "{" expected instead of "myFunc".
2 Error(s) detected.
  1. ПочемуОшибка вызывать myFunc () при объявлении переменной?
  2. Это потому, что она не входит ни в какую функцию?
  3. Как обойти это?

К вашему сведению, я пишу строку obfuscater, которая проходит через строки кода C ++ и заменяет экземпляры строки в кавычках (Пример: "myString") вызовом функции (Пример: scrambleString ("myString")).myFunc в этом примере аналогичен scrambleString


#include <iostream>
#include <string>



using namespace std;


char* myFunc(string inString)
{
    char outString[1024];
    int i;
    for (i = 0; i <= inString.size()-1; i++)
        outString[i] = inString[i];
    outString[i+1] = '\0';
    return outString;
}



// This Works:
static char myVariable1 [ ] = "MyString1" ;

// This Breaks:
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

// This Breaks:
char myVariable5 [1024] = myFunc("MyString3"); // Line
#33





int main()
{
    // This Works:
    string Z = myFunc("Gdkkn Vnqkc");
    cout << "Z = " << Z << endl << endl;    
}

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

Ваш код небезопасен, потому что вы возвращаете содержимое стека, но кроме этого вы возвращаете "char *" .. Ваш код будет компилироваться (но все равно будет небезопасным, поскольку вывозвращая указатель на содержимое стека), если вы измените подпись на:

static char *myVariable = myFunc("foo");

При этом .. Почему бы не вернуть строковый объект вместо использования char *?

1 голос
/ 09 августа 2011

1. Ваша функция

char* myFunc(string inString)
{
    char outString[1024];
    int i;
    for (i = 0; i <= inString.size()-1; i++)
        outString[i] = inString[i];
    outString[i+1] = '\0';
    return outString;
}

имеет ошибку: Вы возвращаете указатель на локальную переменную. после того, как функция возвратит, cariable outString выйдет из области видимости. даже если вы объявите это как std :: string, вы попадете в беду.

2. static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

Здесь размер myVariable2 не известен во время компиляции, так что это сломает

3. char myVariable5 [1024] = myFunc("MyString3");

Это дает сообщение об ошибке как:

error: array must be initialized with a brace-enclosed initializer,

Я думаю, что сообщение об ошибке говорит все это в этом случае. Сообщение об ошибке, которое вы получаете "Error: "{" expected instead of "myFunc". " - это просто еще один способ сказать то же самое.

4.Вы объявляете глобальные переменные, что, как правило, не очень хорошая идея

1 голос
/ 09 августа 2011

Ваш код

// This Works:
static char myVariable1 [ ] = "MyString1" ;

работает, потому что литеральная строка на основе char представляет собой массив char.Итак, вы инициализируете массив массивом.

Следующие несколько строк

// This Breaks:
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

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

Если вы хотите, чтобы некоторые глобальные строковые переменные были инициализированы вызовами функции, тогда рассмотрите возможность использования std::string и / или одноэлементные функции.Например,

static std::string& myVariable2()
{
    static std::string theString = myFunc( "MyString2" );
    return theString;  // Return a reference to the string instance.
}

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

Вместо этого попробуйтеизбегайте глобальных переменных.

Cheers & hth.,

...