鉴于以下test.c程序:
#include <stdio.h>
#include <stdint.h>
typedef struct __attribute__((packed)) {
uint8_t byte;
uint16_t word;
uint32_t int;
} subsystem_data_type;
int subsystem_get_data(subsystem_data_type * outptr);
int main() {
printf("testing\r\n");
return 1;
}
我尝试使用命令gcc -I. test.c
进行编译,但出现以下错误:
test.c:8:14: error: two or more data types in declaration specifiers
uint32_t int;
^
test.c:8:17: warning: declaration does not declare anything
uint32_t int;
^
是否有可能(种类)重新定义int(uint32_t int;
)?我缺少什么?
这是我正在研究的更大的代码和平的一部分。请查看第8页,http://gomspace.com/documents/GS-CSP-1.1.pdf处的subsystem.h代码。什么可能会激励uint32_t int;
?
答案 0 :(得分:4)
int
是保留字,是预定义类型的名称。由于它是保留字,因此您不能将其用作标识符。你需要选择一个不同的名字。
byte
和word
,虽然它们不是保留字或预定义类型,但它们是合理的类型名称,因此我建议不要将它们用作成员名称。它们是完全合法的,但选择不同的名称可以避免混淆。
查看问题中链接的pdf document,第8页上的代码完全不正确。 PDF文档中的代码没有什么特别之处,这些代码已在网络上发布,使其免受错误的影响。 (代码后面的段落将“功能”拼错为“功能”,这是校对不良的另一个迹象。)您可能想联系该文档的作者。在任何情况下,代码都是作为编写子系统API的通用示例,而不是编译和使用的代码。 (但恕我直言,这不是这种错误的借口;如果你要发布源代码,你至少应该验证它是否编译。)
答案 1 :(得分:1)
uint32_t int;
使用其他名称。 int
是c中的关键字,用于声明具有整数类型的变量。
由于这些保留字用于在C程序中执行功能,因此不应用作变量名。
答案 2 :(得分:0)
一个解决方案是#define
,但你不应该这样做。
#include <stdio.h>
#include <stdint.h>
#define int a_integer_value
typedef struct __attribute__((packed)) {
uint8_t byte;
uint16_t word;
uint32_t int;
} subsystem_data_type;
/* change int to signed to avoid confliction */
signed subsystem_get_data(subsystem_data_type * outptr);
signed main() {
printf("testing\r\n");
return 1;
}