Не определяйте переменные в заголовках - это неприятная привычка.
Удалите инициализатор из sMsg[]
в заголовке и добавьте 'extern
' - и определите переменную с инициализатором в соответствующем исходном файле (обычно MyFile.c, если заголовок MyFile.h). Это действительно имеет значение, когда MyFile.h используется несколькими исходными файлами - и если он используется только одним исходным файлом, почему вы вообще использовали заголовок?
Ваш код также включает в себя «PdmTestClnt.h», а не MyFile.h - должны ли мы предполагать, что MyFile.h - это то, что вы хотели включить?
funcxyz()
не имеет возвращаемого типа - он не будет компилироваться в C ++ или при строгом компиляторе C99. Почему функция форматирует в sMsg
, а затем использует fprintf()
для копирования строки? fprintf()
может выполнить всю работу (а затем и некоторую).
Зачем вам нужно глобальное определение
Если у вас есть глобальная переменная, код в main()
инициализирует ее, вызывая fopen()
, и другие функции могут использовать инициализированное значение. Это удобно Когда у вас есть локальная переменная, вы должны ее инициализировать. Это неприятно, потому что в конечном итоге вы открываете файл много раз, что имеет множество нежелательных побочных эффектов - слишком много используемых дескрипторов файлов, вам тоже придется их закрывать, и вы, вероятно, продолжаете обрезать вывод, уже находящийся в файле. Чтобы избежать этого, передайте файловый указатель на функции - или примите, что с глобальным все в порядке. Подумайте об этом - в той или иной форме имена stdin
, stdout
и stderr
также относятся к глобальным переменным.
void funcxyz(FILE *fp)
{
sprintf(sMsg, "************ CHECKING FOR THE CRASH ************. \n");
ERR_MSG (fpErr, sMsg);
}
int main(int argc, char **argv)
{
FILE *fpErr = NULL;
if ((fpErr = sysFopen(sErrFileName, "a+")) != 0)
{
sprintf(sMsg,"Error in opening file %s", sErrFileName);
STD_MSG(sMsg);
}
// Log in the error file
sprintf(sMsg, "Log into the error file. \n");
ERR_MSG(fpErr, sMsg);
funcxyz(fpErr);
return(0);
}