使用C99编译问题是否需要在每个if周围有一个范围?

使用C99编译问题是否需要在每个if周围有一个范围?,c,visual-studio-2013,C,Visual Studio 2013,我认为下面的代码应该用VS'2013 C编译器编译,但它看起来像是一个标识符定义,在没有括号的if(1行if)不起作用之后 不工作,我得到以下错误: 1>..\..\common\threadpool.c(82): error C2275: 'test_t' : illegal use of this type as an expression 1> ..\..\common\threadpool.c(75) : see declaration of 'test_t

我认为下面的代码应该用VS'2013 C编译器编译,但它看起来像是一个标识符定义,在没有括号的
if
(1行
if
)不起作用之后

不工作,我得到以下错误:

1>..\..\common\threadpool.c(82): error C2275: 'test_t' : illegal use of this type as an expression
1>          ..\..\common\threadpool.c(75) : see declaration of 'test_t'
1>..\..\common\threadpool.c(82): error C2065: 'pool' : undeclared identifier


typedef struct { int j; } test_t;

int f(test_t **p_pool, int i)
{
    if (i <= 0)
        return -1;

    test_t *pool;   
    *p_pool = pool;

    return i;
}
1>。\..\common\threadpool.c(82):错误C2275:“test\u t”:非法使用此类型作为表达式
1> ..\..\common\threadpool.c(75):参见“测试”声明
1> ..\..\common\threadpool.c(82):错误C2065:“池”:未声明的标识符
typedef结构{int j;}测试;
int f(测试**p_池,int i)
{

如果(i代码有效并且应该编译。这并不表示这是一个编译器错误。您应该向Microsoft提交一份错误报告

要解决此问题,您需要执行以下操作之一:

  • 从Microsoft获取编译器的更正版本
  • 使用不同的编译器,例如真正的C99编译器
  • 修改代码以避开错误的编译错误

您可以发布准确的错误消息吗?请发布完整且最少的代码来演示问题,因为您发布的代码没有。它是否修复了将行
测试池;
移动到
之前的问题?如果
?我没有看到SSCCE,错误消息指示行75-82,并且发布的代码中只有少量行到目前为止,试图绕过明显的编译器错误是很有可能的,然后可以通过搜索替换/重命名重构将其应用于代码库:从typedefed name中删除
\t
后缀(它在POSIX中保留,因此可能会触发一些有趣的编译器代码路径),或者删除整个typedef并使用
struct test
,或者尝试在
test\u t*pool;
之前添加伪语句,这样它就不是if-then之后的第一件事了。此外,通过要求编译器保存预压器输出来检查是否没有
#define
功能。我认为问题是要求一个解决方法而且,即使在最好的情况下,提交错误报告也可能不够快……正如我所读到的,问题是提出一种解决方法,它不涉及修改“庞大的遗留代码库”中的许多文件@hyde,那解决办法是什么?我想你的评论暗示有一个。事实上,我认为没有解决办法,作为对答案的回应,我通过MS connect网站打开了一个错误通知单。但感谢大家,事实上,你帮助我确认这是一个与类型名称中的“\u t”相关的错误。
typedef struct { int j; } test_t;

int f(test_t **p_pool, int i)
{
    if (i <= 0) {
        return -1;
    }

    test_t *pool;   
    *p_pool = pool;

    return i;
}