我在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.
仅供参考,我正在编写一个字符串混淆器,它通过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;
}
答案 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.您正在宣布“通常”不是一个好主意的全局变量