I haven't found a cross-platform solution to measuring time in C, per se. However, what I do is use almost identical functions for Unix and Windows. I created this gist because I always have to re-look this up every time. In short:
Unix
#include <time.h>
long diff_micro(struct timespec *start, struct timespec *end)
{
    /* us */
    return ((end->tv_sec * (1000000)) + (end->tv_nsec / 1000)) -
        ((start->tv_sec * 1000000) + (start->tv_nsec / 1000));
}
long diff_milli(struct timespec *start, struct timespec *end)
{
    /* ms */
    return ((end->tv_sec * 1000) + (end->tv_nsec / 1000000)) -
        ((start->tv_sec * 1000) + (start->tv_nsec / 1000000));
}
int main(int argc, char **argv)
{
    struct timespec start, end;
    clock_gettime(CLOCK_MONOTONIC, &start);
    // Activity to be timed
    sleep(1000);
    clock_gettime(CLOCK_MONOTONIC, &end);
    printf("%ld us\n", diff_micro(&start, &end));
    printf("%ld ms\n", diff_milli(&start, &end));
    return 0;
}
source for Unix solution
Win32
#include <Windows.h>
long diff_micro(LARGE_INTEGER *start, LARGE_INTEGER *end)
{
    LARGE_INTEGER Frequency, elapsed;
    QueryPerformanceFrequency(&Frequency); 
    elapsed.QuadPart = end->QuadPart - start->QuadPart;
    elapsed.QuadPart *= 1000000;
    elapsed.QuadPart /= Frequency.QuadPart;
    return elapsed.QuadPart;
}
long diff_milli(LARGE_INTEGER *start, LARGE_INTEGER *end)
{
    LARGE_INTEGER Frequency, elapsed;
    QueryPerformanceFrequency(&Frequency); 
    elapsed.QuadPart = end->QuadPart - start->QuadPart;
    elapsed.QuadPart *= 1000;
    elapsed.QuadPart /= Frequency.QuadPart;
    return elapsed.QuadPart;
}
int main(int argc, char **argv)
{
    LARGE_INTEGER StartingTime, EndingTime;
    QueryPerformanceCounter(&StartingTime);
    // Activity to be timed
    Sleep(1000);
    QueryPerformanceCounter(&EndingTime);
    printf("%ld us\n", diff_micro(&StartingTime, &EndingTime));
    printf("%ld ms\n", diff_milli(&StartingTime, &EndingTime));
    return 0;
}
source used for Win32 solution