Если вам нужно использовать структуру в файле .c, то при компиляции требуется полное определение структуры. Это часто делается путем включения заголовочного файла с определением.
Если вам не нужно делиться определением структуры, вы можете поместить его в файл .c, но он будет виден только функциям в этом файле.
Кажется, вы пытаетесь создать интерфейс для своей структуры и определить его только в файле .c, чтобы другие части кода не могли получить доступ к структуре. Вы можете сделать это, но только через указатель. Так, например:
typedef struct MyString* MyString;
И в файле .c вы можете определить его. Вместо этого вы можете определять функции, используя определение типа MyString.