无法弄清楚出了啥问题:“')'标记之前的预期主表达式”
Posted
技术标签:
【中文标题】无法弄清楚出了啥问题:“\')\'标记之前的预期主表达式”【英文标题】:Can't figure out what's wrong: "expected primary-expression before ')' token"无法弄清楚出了什么问题:“')'标记之前的预期主表达式” 【发布时间】:2013-08-07 16:05:01 【问题描述】:不喜欢这个简单代码的第二行:
string str = "Jamin rules";
string str2(str.length()*charbits, '0');
错误是
error: expected primary-expression before ')' token
compilation terminated due to -Wfatal-errors.
你知道吗,
charbits
是我定义的变量
#define charbits 8*sizeof(char);
我认为这是问题所在,因为当我输入代码时代码可以工作
string str2(str.length()*8, '0');
相反。请让我对这种细微差别有所了解。
【问题讨论】:
a#define
不是变量它是替换宏,编译器不需要对宏进行常量折叠
避免像瘟疫这样的宏...
另外,您应该知道您的charbits
不会给您char
中的位数。 sizeof(char)
在任何平台上始终为 1。要获取char
中的位数,请包含climits
并使用CHAR_BIT
宏。
【参考方案1】:
#define charbits 8*sizeof(char);
不应以;
结尾,它将被扩展为;
string str2(str.length()*8*sizeof(char);, '0');
由于 sizeof(char) 被定义为 1,您可以将定义更改为简单;
#define charbits 8
...或者作为一个简单的常量;
#include <stddef.h>
const size_t charbits = 8;
编辑:正如@keiththompson 在下面指出的那样,<climits>
中的CHAR_BIT
定义了每个字符的实际位数,并且显然比硬编码到 8 更便携。
【讨论】:
但这仍然假设char
中恰好有 8 位。在<climits>
中定义的宏CHAR_BIT
为您提供char
中的实际位数;它保证至少为 8,并且在大多数实现中正好是 8,但可以更大。
@KeithThompson 没错,只是在翻译现有代码,CHAR_BIT
如果提问者不想将他的陈述的长度固定为 8,那肯定会更好。【参考方案2】:
由于您的定义,您被插入了一个假分号
#define charbits 8*sizeof(char);
删除它,您将摆脱错误。
Event 最好将其更改为静态 const 而不是 #define,因此不鼓励这样做。
static const size_t charbits = 8 * sizeof(char);
【讨论】:
【参考方案3】:预处理器将charbits
替换为8*sizeof(char);
问题是 ;
手动替换它时没有它
因此,
#define charbits 8*sizeof(char)
应该做的工作。
【讨论】:
以上是关于无法弄清楚出了啥问题:“')'标记之前的预期主表达式”的主要内容,如果未能解决你的问题,请参考以下文章