大头文件c ++中字符串常量前的语法错误
Syntax error before string constant in large header file c++
我想通过 SDK 将 .hik (Hikvision) 格式的视频提取为 MP4。我的代码是下一个:
#include <stdio.h>
#include <stdlib.h>
#include "../SDK/incEn/HCNetSDK.h"
#include "Windows.h"
using namespace std;
int saveRecordFile(int userId, char * srcfile, char * destfile) {
HINSTANCE hGetProcIDDLL = LoadLibrary("D:\ExtraccionYConversionArchivos\c++\Fuente\SDK\HCNetSDK.dll");
int bRes = 1;
int hPlayBack = 0;
if ( (hPlayBack = NET_DVR_GetFileByName(userId, srcfile, destfile)) < 0)
{
printf("Error en GetFileByName. Error[$d]\n",NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
if (!NET_DVR_PlayBackControl(hPlayBack, NET_DVR_PLAYSTART,0,NULL))
{
printf("Control de play back fallido [%d]\n", NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
int nPos = 0;
for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayBack))
{
Sleep(5000);
}
printf("Se obtuvo %d\n", nPos);
if (!NET_DVR_StopGetFile(hPlayBack))
{
printf("Error al detener descarga de archivo [%d]\n",NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
printf("%s\n",srcfile);
if (nPos < 0 || nPos > 100)
{
printf("Error de descarga [%d]\n", NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
else
{
return 0;
}
}
int main()
{
printf("Hello world!\n");
return 0;
}
它使用了 HCNetSDK.h 头文件,它在多行中抛出了一个错误:字符串常量之前的语法错误。 这个头文件有超过 41K 行,并且大多数错误发生在 typedef:
之后
typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser);
可能是什么问题?在这行之前,有超过 6K 的 typedef struct 是这样的:
typedef struct tagNET_DVR_MATRIX_STATUS_V50
{
DWORD dwSize;
BYTE byMainFrameType;
BYTE bySoltNum;
BYTE byBoardNum;
BYTE byLCDPanelStatus;
NET_DVR_MATRIX_SUBBOARD_V50 struMatrixSubboard[MAX_MATRIX_SUBBOARD_NUM];
DWORD dwFanSequence;
DWORD dwFanConnectStatus;
DWORD dwFanOperationStatus;
BYTE byDeviceModel[32];
BYTE byRes[32];
}NET_DVR_MATRIX_STATUS_V50, *LPNET_DVR_MATRIX_STATUS_V50;
即使我对每个 typedef 结构进行注释以发现错误,我也不知道如何做到。
一些尝试:
查找包含此 header 的另一个文件。它编译吗?它使用了哪些其他 header 以及哪些位于列表中 header 之前?
你能用简单的 hello world main 函数将这段代码复制(复制并重命名)到 C 文件中吗?它可能会强制编译器告诉您实际问题出在哪一行。
您使用的是旧编译器吗?我曾经遇到过旧版本 Visual Studio 的问题——它不是 C99 的最新版本,所以它不能编译某些数据类型(这对 GNU 编译器来说没有问题)。 C 标准有时会更新,您需要使用合适的编译器(或旧式代码!)。
最后,能否用ffmpeg提取或转换数据?如果您可以在命令行上完成,则无需编译任何代码。
我想通过 SDK 将 .hik (Hikvision) 格式的视频提取为 MP4。我的代码是下一个:
#include <stdio.h>
#include <stdlib.h>
#include "../SDK/incEn/HCNetSDK.h"
#include "Windows.h"
using namespace std;
int saveRecordFile(int userId, char * srcfile, char * destfile) {
HINSTANCE hGetProcIDDLL = LoadLibrary("D:\ExtraccionYConversionArchivos\c++\Fuente\SDK\HCNetSDK.dll");
int bRes = 1;
int hPlayBack = 0;
if ( (hPlayBack = NET_DVR_GetFileByName(userId, srcfile, destfile)) < 0)
{
printf("Error en GetFileByName. Error[$d]\n",NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
if (!NET_DVR_PlayBackControl(hPlayBack, NET_DVR_PLAYSTART,0,NULL))
{
printf("Control de play back fallido [%d]\n", NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
int nPos = 0;
for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayBack))
{
Sleep(5000);
}
printf("Se obtuvo %d\n", nPos);
if (!NET_DVR_StopGetFile(hPlayBack))
{
printf("Error al detener descarga de archivo [%d]\n",NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
printf("%s\n",srcfile);
if (nPos < 0 || nPos > 100)
{
printf("Error de descarga [%d]\n", NET_DVR_GetLastError());
bRes = -1;
return bRes;
}
else
{
return 0;
}
}
int main()
{
printf("Hello world!\n");
return 0;
}
它使用了 HCNetSDK.h 头文件,它在多行中抛出了一个错误:字符串常量之前的语法错误。 这个头文件有超过 41K 行,并且大多数错误发生在 typedef:
之后typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser);
可能是什么问题?在这行之前,有超过 6K 的 typedef struct 是这样的:
typedef struct tagNET_DVR_MATRIX_STATUS_V50
{
DWORD dwSize;
BYTE byMainFrameType;
BYTE bySoltNum;
BYTE byBoardNum;
BYTE byLCDPanelStatus;
NET_DVR_MATRIX_SUBBOARD_V50 struMatrixSubboard[MAX_MATRIX_SUBBOARD_NUM];
DWORD dwFanSequence;
DWORD dwFanConnectStatus;
DWORD dwFanOperationStatus;
BYTE byDeviceModel[32];
BYTE byRes[32];
}NET_DVR_MATRIX_STATUS_V50, *LPNET_DVR_MATRIX_STATUS_V50;
即使我对每个 typedef 结构进行注释以发现错误,我也不知道如何做到。
一些尝试: 查找包含此 header 的另一个文件。它编译吗?它使用了哪些其他 header 以及哪些位于列表中 header 之前?
你能用简单的 hello world main 函数将这段代码复制(复制并重命名)到 C 文件中吗?它可能会强制编译器告诉您实际问题出在哪一行。
您使用的是旧编译器吗?我曾经遇到过旧版本 Visual Studio 的问题——它不是 C99 的最新版本,所以它不能编译某些数据类型(这对 GNU 编译器来说没有问题)。 C 标准有时会更新,您需要使用合适的编译器(或旧式代码!)。
最后,能否用ffmpeg提取或转换数据?如果您可以在命令行上完成,则无需编译任何代码。