2013-08-07 26 views
1

它不喜欢的这个简单的代码的第2行:不能找出什么是错的:“之前的预期主表达式‘)’标记”

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'); 

,而不是类型。请给我一些洞察这个细微差别。

+1

'#define'不是一个变量它是一个替代宏,编译器不需要对宏进行常量折叠 – Mgetz

+0

避免宏如鼠疫...... –

+1

另外,你应该知道你的'charbits'赢得'给你一个'char'中的位数。 sizeof(char)'在任何平台上总是为1。要获得'char'中的位数,可以包含'climits'并使用'CHAR_BIT'宏。 – zindorsky

回答

8
#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下面所指出的,在CHAR_BIT限定<climits>每字符的比特的实际数目,并且明显比硬编码更容易移植到8

+2

但是,仍然假定'char'中只有8位。在''中定义的宏CHAR_BIT给出了'char'中的实际位数;它保证至少有8个,在大多数实现中都是8,但可以更大。 –

+0

@KeithThompson真的,只是翻译现有的代码,如果提问者不希望他的表示长度固定为8,'CHAR_BIT'肯定会更好。 –

2

您插入一个suprious半冒号由于你的定义

#define charbits 8*sizeof(char); 

删除它,你会摆脱错误。

事件更好地将其更改为静态常量而不是#define,因此非常不鼓励。

static const size_t charbits = 8 * sizeof(char); 
1

预处理器替换charbits8*sizeof(char); 的问题是,当你手动更换它 因此,你没有;

#define charbits 8*sizeof(char)

应该做的工作。

相关问题