无法弄清楚出了啥问题:“')'标记之前的预期主表达式”

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 在下面指出的那样,&lt;climits&gt; 中的CHAR_BIT 定义了每个字符的实际位数,并且显然比硬编码到 8 更便携。

【讨论】:

但这仍然假设char 中恰好有 8 位。在&lt;climits&gt; 中定义的宏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)

应该做的工作。

【讨论】:

以上是关于无法弄清楚出了啥问题:“')'标记之前的预期主表达式”的主要内容,如果未能解决你的问题,请参考以下文章

strcmp - '[' 标记之前的预期主表达式

c++ if (DEBUG) ... '==' 标记之前的预期主表达式

cpp:“。”标记之前的预期主表达式

联合初始化程序“错误:‘。’标记之前的预期主表达式”

矩阵类:错误:“)”标记之前的预期主表达式

Express 无法 PUT/DELETE 方法。出了啥问题?