Skip to content

📘 C++ Style Guide

🏷️ Naming Conventions

╔════════════════════════════════════════════════════════════╗ ║ Element │ Convention │ Example ║ ╠════════════════╪═══════════════╪══════════════════════════╣ ║ Classes │ PascalCase │ AudioProcessor ║ ║ Functions │ camelCase │ processBuffer() ║ ║ Variables │ snake_case │ sample_rate ║ ║ Constants │ UPPER_CASE │ MAX_BUFFER_SIZE ║ ║ Members │ snake_case_ │ buffer_size_ ║ ║ Namespaces │ lowercase │ audiolab::dsp ║ ╚════════════════════════════════════════════════════════════╝

📁 File Organization

// AudioProcessor.hpp
#pragma once  // Preferred over header guards

// System includes
#include <vector>
#include <memory>

// Third-party includes
#include <juce/juce.h>

// Project includes
#include "DSP/Filter.hpp"

namespace audiolab {

class AudioProcessor {
public:
    // Public interface first

private:
    // Implementation details last
};

} // namespace audiolab

💬 Comment Style

/// Brief description of function.
///
/// Detailed description if needed.
/// Can span multiple lines.
///
/// @param buffer Input audio buffer
/// @param size Size of buffer in samples
/// @return Processing result
ProcessResult processAudio(float* buffer, size_t size);

🔧 Error Handling

// ✅ GOOD: Exceptions for exceptional errors
if (!file.open()) {
    throw std::runtime_error("Failed to open file");
}

// ✅ GOOD: Return codes for expected errors
Result tryProcess(Buffer& buffer) {
    if (buffer.empty()) return Result::EmptyBuffer;
    // ...
}

// ❌ BAD: Exceptions in real-time code
void audioCallback(float* buffer, size_t size) {
    throw std::exception();  // NEVER!
}

🧠 Memory Management

// ✅ GOOD: RAII everywhere
std::unique_ptr<Processor> processor = std::make_unique<Processor>();

// ✅ GOOD: Smart pointers
std::shared_ptr<Resource> shared_resource;

// ❌ BAD: Manual memory management
Processor* processor = new Processor();  // NO!