下面的代码片段按原样工作,但如果我取消注释第一个#define并注释第二个,则编译器抱怨在赋值语句中期望')'。以为它可能想要一个演员,但这没有帮助。请指出我的愚蠢疏忽。
谢谢, JH
//#define SMI_READ (0b10 << 10)
#define SMI_READ (0x2 << 10)
...
command |= SMI_READ;
答案 0 :(得分:3)
一般来说,要回答这样的问题,我们需要查看错误消息的完整和未经编辑的文本,如果您提供完整程序我们可以尝试为自己编译。 (在您看来,错误消息可能毫无用处,但通常只有在您知道如何像编译工程师一样思考时才有意义。)
然而,在这种情况下,我可以做出高可信度的猜测,因为两个宏之间的唯一区别是不工作的那个使用二进制数private class GetUrlContentTask extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... urls) {
// String content1 = "";
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = "", line;
while ((line = rd.readLine()) != null) {
content += line + "\n";
}
// content1 = content;
}
catch (Exception e) {
e.printStackTrace();
}
// return content1; - returns "", wrong
return "aaa";
//does not work return content;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(String result) {
// this is executed on the main thread after the process is over
// update your UI here
}
}
,并且一个可行的工作使用十六进制数0b10
。二进制数字不是C标准的任何版本的一部分,尽管它们是常见的扩展。因此,我推断出您的编译器不支持它们,并在遇到它们时给出一条不清楚的错误消息。
答案 1 :(得分:2)
来自C标准(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)
6.4.4.1整数常数
...
八进制常数:
0
八进制常数八进制数 ...
十六进制前缀:中的一个 0x 0X
没有描述其他前缀,特别是没有任何内容会涵盖0b10
。