0

我在一个 Solaris 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. 如何绕过它?

仅供参考,我正在编写一个字符串混淆器,它通过 C++ 代码行并用函数调用(例如:scrambleString("myString"))替换引用字符串的实例(例如:“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;    
}
4

3 回答 3

3

您的代码不安全,因为您正在返回堆栈内容,但除此之外,您正在返回“char *”。您的代码将编译(但仍然不安全,因为您正在返回指向堆栈内容的指针)如果您将签名更改为:

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

话虽如此.. 为什么不返回字符串对象而不是使用 char*?

于 2011-08-08T21:44:32.220 回答
1

你的代码

// 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.
}

但是,这是针对不良设计的技术解决方案,因此我仅将其推荐为针对当前问题的纯技术解决方案。

相反,尽量避免使用全局变量。

干杯&hth.,

于 2011-08-08T21:47:02.810 回答
1

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;
}

有一个错误:您正在返回指向局部变量的指针。函数返回后,可调用的 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.您正在声明“通常”不是一个好主意的全局变量

于 2011-08-08T23:15:35.130 回答