【问题标题】:C2061 Syntax Error (identifier)C2061 语法错误(标识符)
【发布时间】:2011-04-07 04:11:20
【问题描述】:
1>cb.c(51): error C2061: syntax error : identifier 'SaveConfiguration'
1>cb.c(51): error C2059: syntax error : ';'
1>cb.c(51): error C2059: syntax error : 'type'
1>cb.c(52): error C2061: syntax error : identifier 'LoadConfiguration'
1>cb.c(52): error C2059: syntax error : ';'
1>cb.c(52): error C2059: syntax error : 'type'
1>cb.c(122): error C2061: syntax error : identifier 'SaveConfiguration'
1>cb.c(122): error C2059: syntax error : ';'
1>cb.c(122): error C2059: syntax error : 'type'
1>cb.c(127): error C2061: syntax error : identifier 'LoadConfiguration'
1>cb.c(127): error C2059: syntax error : ';'
1>cb.c(127): error C2059: syntax error : 'type'
1>
1>Build FAILED.

这只是项目中的一个 .c 文件。代码如下:

#define WIN32_LEAN_AND_MEAN

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <tchar.h>

typedef struct _Configuration
{
    int             KeyActivate;
    int             BlockWidth;
    int             BlockHeight;
    double          HueStart;
    double          HueEnd;
    double          SaturationStart;
    double          SaturationEnd;
    double          ValueStart;
    double          ValueEnd;
} Configuration;

typedef struct _DIBSection
{
    HDC     ScreenDC;
    HDC     WindowDC;
    HDC     MemoryDC;
    HBITMAP ScreenBMPHandle;
    BITMAP  ScreenBMP;
} DIBSection;

typedef struct _Thread
{
    HANDLE      Handle;
    unsigned    Id;
} Thread;

typedef struct _Window
{
    HANDLE  Handle;
    HDC     DC;
    int     Width;
    int     Height;
    int     Top;
    int     Left;
} Window;

__declspec ( dllexport ) int Initialize ( void );
unsigned __stdcall Start ( void * Arguments );

void LoadDefaultConfiguration ( Configuration * Config );
bool SaveConfiguration ( Configuration * Config, LPTSTR FilePath );
bool LoadConfiguration ( Configuration * Config, LPTSTR FilePath );

Thread          MainThread;
Window          Screen;
Configuration   Settings;

BOOL WINAPI DllMain ( HINSTANCE Instance, DWORD Reason, LPVOID Reserved )
{
    switch ( Reason )
    {

        case DLL_PROCESS_ATTACH:

            // TODO: Load settings from file
            LoadDefaultConfiguration ( & Settings );

            // Create main thread
            MainThread.Handle = (HANDLE) _beginthreadex (
                NULL,
                0,
                Start,
                NULL,
                0,
                & MainThread.Id
                );

            if ( MainThread.Handle )
            {
                SetThreadPriority ( MainThread.Handle, THREAD_PRIORITY_BELOW_NORMAL );
            }
            else
            {
                MessageBox ( NULL, L"Unable to create main thread; exiting", L"Error", MB_OK );
                ExitProcess ( 0 );
            }

            break;

        case DLL_PROCESS_DETACH:

            break;

    }

    return TRUE;
}

__declspec ( dllexport ) int Initialize ( void )
{
    return 1;
}

unsigned __stdcall Start ( void * Arguments )
{
    return 1;
}

void LoadDefaultConfiguration ( Configuration * Config )
{
    Config->BlockHeight = 50;
    Config->BlockWidth = 100;
    Config->HueEnd = 0.00;
    Config->HueStart = 0.00;
    Config->KeyActivate = VK_SHIFT;
    Config->SaturationEnd = 0.00;
    Config->SaturationStart = 0.00;
    Config->ValueEnd = 0.00;
    Config->ValueStart = 0.00;
}

bool SaveConfiguration ( Configuration * Config, LPTSTR FilePath )
{
    return true;
}

bool LoadConfiguration ( Configuration * Config, LPTSTR FilePath )
{
    return true;
}

第 51 行是

bool SaveConfiguration ( Configuration * Config, LPTSTR FilePath );

【问题讨论】:

  • 这个错误可能是相互依赖的头文件引起的。

标签: c compiler-errors syntax-error


【解决方案1】:

bool 不是 C 类型。

我确实怀疑 BOOL 是在某处定义的。

truefalse 的用法也是如此。

【讨论】:

【解决方案2】:

实际上,bool 是 C99 标准中的有效类型(实际上是宏),假设您使用的是最近的编译器。您需要添加:

#include <stdbool.h>

请注意,bool 在旧的 ANSI、C89、C90 等 C 标准变体中无效。


正如 JeremyP 在 cmets 中强调的那样,微软的 C 编译器仍然缺乏对 C99 功能的适当支持。

剩下三种选择:

  1. 将其视为 C++,而不是 C;因为 C++ 有 bool 作为内置类型
  2. 创建您自己的bool 实现
  3. 重写代码以避免使用bool

对于选项 2,这样的事情会起作用,但这是一个丑陋的解决方法:

typedef short bool;
#define true 1
#define false 0

【讨论】:

  • 他没有使用最新的编译器,他使用的是不支持 C99 的 Microsoft Visual C。
  • 好点。我原以为微软会在过去十年中的某个时候添加它,但他们似乎(经过一些阅读之后)忽略了 C99,而是将精力集中在 C++0x 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多