Вы включаете файл parser.c, что означает, что весь код в этом файле будет «скопирован» в файл assemblyr.c. Это означает, что все содержимое файла parser.c будет скомпилировано, когда компилятор компилирует parser.c, а затем оно будет скомпилировано снова, когда компилятор компилирует ассемблер.c
Вот для чего нужны заголовки.
В заголовке вы можете поместить только объявления, поэтому вы можете включить их, не создавая те же символы снова в другой единице перевода.
, так что вы можете просто создать parser.h, содержащий только объявление функции:
void parse_file(char *config_file);
тогда в вашем ассемблере вы включаете только заголовок:
#include "parser.h" //include the header, not the implementation
int main() {
parse_file("test.txt");
return 0;
}