C程序 – 在编译器中标记为未声明的结构

我正在尝试编写一个程序来收集有关文件的安全信息并将其转换为人类可读的信息。 但是,我在初始化结构指针时遇到问题:

#include  #include  #pragma comment(lib, "advapi32.lib") struct file_perms { char user_domain[2050]; unsigned long user_mask; }; static myfunc (){ PSECURITY_DESCRIPTOR pSD = NULL; PACL pDACL = NULL; char *file = "D:/code/test.c"; ACL_SIZE_INFORMATION aclSize; ULONG result = GetNamedSecurityInfo(file,SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, &pSD); if (ERROR_SUCCESS != result) { printf( "GetNamedSecurityInfo Error %u\n", result ); } if(pDACL != NULL){printf ("2\n");} //ACL_SIZE_INFORMATION aclSize = {0}; ZeroMemory(&aclSize, sizeof(ACL_SIZE_INFORMATION)); if(pDACL != NULL){ if(!GetAclInformation(pDACL, &aclSize, sizeof(aclSize), AclSizeInformation)){ printf("GetAclInformation Error \n"); return 0; } printf("AceCount %d\n",aclSize.AceCount); } file_perms *fp = new file_perms[aclSize.AceCount]; } 

编译时,我收到以下错误。 getnamed.c

 getnamed.c(34) : error C2065: 'file_perms' : undeclared identifier getnamed.c(34) : error C2065: 'fp' : undeclared identifier getnamed.c(34) : error C2065: 'new' : undeclared identifier getnamed.c(34) : error C2106: '=' : left operand must be l-value getnamed.c(34) : error C2146: syntax error : missing ';' before identifier 'file _perms' getnamed.c(34) : error C2065: 'file_perms' : undeclared identifier getnamed.c(34) : error C2109: subscript requires array or pointer type 

有人可以帮我理解为什么file_perms被标记为未声明的标识符? 虽然它已被宣布为结构?

谢谢您的帮助。

你应该有

 struct file_perms *fp = new file_perms[aclSize.AceCount]; 

或者在开始时创建类型:

 typedef struct file_perms { char user_domain[2050]; unsigned long user_mask; }file_perm; 

以后你可以像使用它一样

 file_perms *fp; fp = (file_perms*)malloc(aclSize.AceCount * sizeof(file_perms)); 

BTW:operator new是c ++语法,而不是纯C,你最有可能尝试将C ++代码编译为C语言

因为您正在将代码编译为C代码。 它是C ++。

如果您希望将其编译为C,请尝试以下操作:

 typedef struct file_perms_ { char user_domain[2050]; unsigned long user_mask; } file_perms; 

更改

 struct file_perms{ char user_domain[2050]; unsigned long user_mask; }; 

这将解决您的问题:

 struct{ char user_domain[2050]; unsigned long user_mask; }file_perms;