"Is there some way to get this to work without having to stuff all of the .c code inside the .h file?"
and from comments...
"...but I wish to be able to define the macro in my main file and have it be visible from the .c file too
So, you are asking to #include one .c file into another .c file.  This is doable with caution.  But because a .c file containing the main() function cannot be #include into another .c file without invoking a multiply defined symbol error for main(...), it has to be the other way around.  That is a dedicated .c file (eg. enabled.c) could be created that contains all of the #defines function prototypes and definitions. This .c file can then be #included into main.c to hopefully satisfy a variation of what you are looking for.
Following is tested source code that does this:
enable.c
#define _ENABLE_ 
//test criteria - then create prototype of enabled_function
#ifdef _ENABLE_
static int enabled_function(int a, int b);
#endif
#ifdef _ENABLE_
static int enabled_function(int a, int b)
{
    return a + b;
}    
#endif
static int use_enabled_function(int a, int b); 
//This will be created with or without _ENABLE_, but its
//definition changes based on whether _ENABLE_ exists or not. 
static int use_enabled_function(int a, int b)
{
    #ifdef _ENABLE_
    return enabled_function(a, b);
    #elif
    return -1;
    #endif
}    
main.c
#include "enable.c"
int main(void)
{
    //test criteria - then use enabled_function
    #ifdef _ENABLE_ //must include test for existence before using
    printf("%d\n", enabled_function(10, 10));
    #endif
    //no need to test criteria here (tested internally)
    printf("%d\n", use_enabled_function(10, 10));
    return 0;
}