У меня есть строка исходного кода:
time_t l1_QuoteTime;
Я получаю следующую ошибку:
[BCC32 Error] QuoteDefs.h(18): E2303 Type name expected
Full parser context
Unit1.cpp(7): #include api\dasapi.h
dasapi.h(13): #include api\QuoteDefs.h
QuoteDefs.h(9): class st_L1Quotes
Я включил <time.h>
, Что мне здесь не хватает?
Код:
class st_L1Quotes
{
public:
char secsym[10];
char PrimExch;
int mstatus;
double l1_BidPrice;
int l1_BidSize;
double l1_AskPrice;
int l1_AskSize;
time_t l1_QuoteTime;
double l1_lastPrice;
double l1_todayhigh;
double l1_todaylow;
double l1_todayclose;
int l1_volume;
double l1_yclose;
double l1_todayopen;
double l1_LastBidPrice;
// this is used for show up/down arrow for NASDAQ NMS stocks;
};
Где <time.h>
(это должно быть <ctime>
) включены в стоимость "api/dasapi.h"
заголовок?
Действительно, QuoteDefs.h
заголовок должен вероятно #include
или <time.h>
или же <ctime>
сам по себе, так как он не может быть использован, если он не включен. Я вижу, как time_t
в 11-й строке фрагмента кода, отформатированный мной, может быть в 9-й строке в вашем форматировании кода, но нет места для защиты заголовка или необходимых #include
,
Общий совет:
Автономное означает, что вы должны быть в состоянии написать:
#include "header.h"
вверху файла и код должен скомпилироваться без ошибок.
Идемпотент означает, что не должно иметь значения, включен ли заголовок дважды. Обычно это не может быть сделано напрямую; скорее источник будет включать заголовок напрямую, а некоторые другие заголовки также будут косвенно включать заголовок (или два других заголовка будут включать его косвенно). Подумайте, что было бы неприятно, если бы вы могли включить только <stdio.h>
или же <iostream>
один раз!
Вы можете проверить идемпотентность, написав:
#include "header.h"#include "header.h"
вверху файла и код должен скомпилироваться без ошибок.
У меня даже есть сценарий под названием chkhdr
автоматизировать тестирование:
#!/bin/ksh
#
# @(#)$Id: chkhdr.sh,v 1.3 2011/07/25 07:09:49 jleffler Exp $
#
# Check whether a header can be compiled standalone
tmp=chkhdr-$$
trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15
cat >$tmp.c <<EOF
#include HEADER /* Check self-containment */
#include HEADER /* Check idempotency */
int main(void){return 0;}
EOF
options=
for file in "$@"do
case "$file" in
(-*) options="$options $file";;
(*) echo "$file:"${CC:-gcc} $options -DHEADER="\"$file\"" -c $tmp.c
;;
esac
done
rm -f $tmp.?
trap 0
Других решений пока нет …