在Solaris 10上非常简单的编译失败

时间:2011-08-08 21:34:27

标签: c++ solaris solaris-10

我在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. 如何绕过它?
  4. 仅供参考,我正在编写一个字符串混淆器,它通过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 个答案:

答案 0 :(得分:3)

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

,则返回指向堆栈上内容的指针
static char *myVariable = myFunc("foo");

那就是说..为什么不返回字符串对象而不是使用char *?

答案 1 :(得分: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.
}

然而,这是一个糟糕设计的技术解决方案,所以我只是推荐它作为解决当前问题的纯粹技术解决方案。

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

干杯&amp;第h。,

答案 2 :(得分: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;
}

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