C 语言中的错误 C2059 和 C2061

发布于 2025-01-08 04:03:16 字数 3954 浏览 0 评论 0原文

可能的重复:
为什么语法正确时 VS2010 会给出语法错误?< /a>

我正在尝试使用 Visual Studio 2010 用 C 语言开发一种 Windows 32 服务。

我创建了一个新项目,并插入了 .c 文件:

  • main.c
  • service.c
  • Misc.c

我还有两个头文件:

  • myerrors.h
  • my.h

这是我的代码(请注意,这只是一个草稿)。

main.c:

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "stdafx.h"
#include "my.h"
#include "myerrors.h"

static int parse_args(int ac, char **av)
{
    int i = 0;

    while (++i < ac)
        if (strcmp(av[i], "-i") && !InstallMyService())
            return false;
        else if (strcmp(av[i], "-d") && !UninstallMyService())
            return false;
        else if (strcmp(av[i], "-p"))
            if (!av[i + 1])
                return false;
            else
            {
                if (!InsertPathInRegistry(av[i + 1]))
                    return false;
                i++;
            }
        else
            return false;
    return true;
}

int main(int ac, char **av)
{
    HANDLE hLogFile;

    if ((hLogFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
        aff_error(CANT_CREATE_FILE);    
    if (ac > 1)
    {
        if (!parse_args(ac, av))
        {
            aff_error(BAD_ARGUMENTS);
            return EXIT_FAILURE;
        }
    }
    else
    {
        SERVICE_TABLE_ENTRY DispatchTable[] = {{DC_SERVICE_NAME, ServiceMain}, {NULL, NULL}};
        StartServiceCtrlDispatcher(DispatchTable);
    }
    getchar();
    if (!CloseHandle(hLogFile))
        aff_error(CLOSE_FILE_FAILED);
    return EXIT_SUCCESS;
}

misc.c:

#include <Windows.h>
#include <stdio.h>
#include "my.h"
#include "myerrors.h"

void aff_error(char *error_str)
{
    fprintf(stderr, "ERROR: %s\n", error_str);
}

bool InsertPathInRegistry(char *path)
{
    printf("LOG: Inserting %s as ", path);
}

void WriteInLogFile(HANDLE hLogFile, char *log_string)
{
    printf("WriteInLogFile function");
}

service.c:

#include <Windows.h>
#include "my.h"

bool InstallMyService()
{
    return true;
}

bool UninstallMyService()
{
    return true;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{

}

void WINAPI ServiceMain(DWORD ac, LPTSTR *av)
{

}

我的标头只是一些函数声明和宏,例如:

# define DC_SERVICE_NAME    "MyService"

/* MISC functions */

void aff_error(char *error_str);

my.h

#ifndef _MY_H_
# define _MY_H_

#include <Windows.h>
#include <strsafe.h>

/* Macros */

# define LOG_FILE_PATH      "c:\\my_log_file.txt"
# define DC_SERVICE_NAME    "MyService"

/* MISC functions */

void aff_error(char *error_str);

/* SERVICE functions */

void WINAPI ServiceMain(DWORD ac, LPTSTR *av);
bool InstallMyService();
bool UninstallMyService();
bool InsertPathInRegistry(char *path);
void WINAPI ServiceCtrlHandler(DWORD Opcode);

#endif /*!MY_H_ */

在尝试编译项目时,我遇到了一些奇怪的错误:

my.h(19): error C2061: syntax error : identifier 'InstallMyService'
my.h(19): error C2059: syntax error : ';'
my.h(19): error C2059: syntax error : ')'

或者:

my.h(21): error C2061: syntax error : identifier 'InsertPathInRegistry'
my.h(21): error C2059: syntax error : ';'
my.h(21): error C2059: syntax error : 'type'

我检查了一些论坛,上面写着这些错误通常是包含放置不当的错误,但在这种情况下我真的不知道,我不认为我在包含方面犯了错误......

任何人都可以照亮我吗?

谢谢。

Possible Duplicate:
Why does VS2010 give syntax errors when syntax is correct?

I'm trying to develop a kind of Windows 32 service in C language, using Visual Studio 2010.

I created a new project, and inserted .c files :

  • main.c
  • service.c
  • misc.c

I also have two header files :

  • myerrors.h
  • my.h

Here's the code I have (be aware that it's just a draft).

main.c :

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "stdafx.h"
#include "my.h"
#include "myerrors.h"

static int parse_args(int ac, char **av)
{
    int i = 0;

    while (++i < ac)
        if (strcmp(av[i], "-i") && !InstallMyService())
            return false;
        else if (strcmp(av[i], "-d") && !UninstallMyService())
            return false;
        else if (strcmp(av[i], "-p"))
            if (!av[i + 1])
                return false;
            else
            {
                if (!InsertPathInRegistry(av[i + 1]))
                    return false;
                i++;
            }
        else
            return false;
    return true;
}

int main(int ac, char **av)
{
    HANDLE hLogFile;

    if ((hLogFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
        aff_error(CANT_CREATE_FILE);    
    if (ac > 1)
    {
        if (!parse_args(ac, av))
        {
            aff_error(BAD_ARGUMENTS);
            return EXIT_FAILURE;
        }
    }
    else
    {
        SERVICE_TABLE_ENTRY DispatchTable[] = {{DC_SERVICE_NAME, ServiceMain}, {NULL, NULL}};
        StartServiceCtrlDispatcher(DispatchTable);
    }
    getchar();
    if (!CloseHandle(hLogFile))
        aff_error(CLOSE_FILE_FAILED);
    return EXIT_SUCCESS;
}

misc.c :

#include <Windows.h>
#include <stdio.h>
#include "my.h"
#include "myerrors.h"

void aff_error(char *error_str)
{
    fprintf(stderr, "ERROR: %s\n", error_str);
}

bool InsertPathInRegistry(char *path)
{
    printf("LOG: Inserting %s as ", path);
}

void WriteInLogFile(HANDLE hLogFile, char *log_string)
{
    printf("WriteInLogFile function");
}

service.c :

#include <Windows.h>
#include "my.h"

bool InstallMyService()
{
    return true;
}

bool UninstallMyService()
{
    return true;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{

}

void WINAPI ServiceMain(DWORD ac, LPTSTR *av)
{

}

My headers are just some function declarations and macros such as :

# define DC_SERVICE_NAME    "MyService"

/* MISC functions */

void aff_error(char *error_str);

my.h

#ifndef _MY_H_
# define _MY_H_

#include <Windows.h>
#include <strsafe.h>

/* Macros */

# define LOG_FILE_PATH      "c:\\my_log_file.txt"
# define DC_SERVICE_NAME    "MyService"

/* MISC functions */

void aff_error(char *error_str);

/* SERVICE functions */

void WINAPI ServiceMain(DWORD ac, LPTSTR *av);
bool InstallMyService();
bool UninstallMyService();
bool InsertPathInRegistry(char *path);
void WINAPI ServiceCtrlHandler(DWORD Opcode);

#endif /*!MY_H_ */

While trying to compile the project, i got some weird errors :

my.h(19): error C2061: syntax error : identifier 'InstallMyService'
my.h(19): error C2059: syntax error : ';'
my.h(19): error C2059: syntax error : ')'

Or :

my.h(21): error C2061: syntax error : identifier 'InsertPathInRegistry'
my.h(21): error C2059: syntax error : ';'
my.h(21): error C2059: syntax error : 'type'

I checked on some forums that says those errors are commonly errors with includes badly placed, but I don't really know in this case, I don't think I made mistakes with includes...

Can anyone illuminate me ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揪着可爱 2025-01-15 04:03:16

bool 不是 ANSI C 中的数据类型。它是该语言的 C99 版本中的数据类型,仅当包含 ,但Visual Studio不支持C99,仅支持C89(C99还添加了_Bool数据类型,可以在不包含任何标头的情况下使用)。

我建议您将 bool 替换为其他类型,例如 int,或者使用 typedef 将其别名为 intunsigned char 之类的。

bool is not a data type in ANSI C. It is a data type in the C99 version of the language, only if <stdbool.h> is included, but Visual Studio does not support C99, only C89 (C99 also adds the _Bool data type, which can be used without including any headers).

I suggest you replace bool with another type such as int, or use a typedef to alias it with int or unsigned char or something.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文